Проблема в том, что вы используете попробовать, кроме неправильного. Целью блоков try-catch является обработка ошибок во время выполнения, которые вы, возможно, уже знаете. Однако определение таких вещей, как функции или классы, не генерирует ошибки во время выполнения. Если ваше определение неверно, переводчик даже не начнет свою работу. Когда вы определяете функцию, вы просто указываете ей, что делать, если она вызывается. Если вы определяете функцию, которая может вызвать ошибку, как в следующем примере, код с определением функции будет по-прежнему выполняться:
number_of_oranges = 40
total_students = 0
def give_oranges():
orange_for_each = number_of_oranges/total_students
return orange_for_each
give_oranges()
Здесь, когда вы вызываете функцию give_oranges()
, она будет работать большую часть раз, за исключением случаев, когда нет учеников, что означает total_students = 0
, это вызовет ошибку ZeroDivisionError
. Таким образом, мы помещаем оператор, в котором мы вызываем эту функцию, в try-exc. Запомните, это не определение функции, потому что она просто определяет функцию, но больше ничего не делает.
number_of_oranges = 40
total_students = 0
def give_oranges():
orange_for_each = number_of_oranges/total_students
return orange_for_each
try:
give_oranges()
except ZeroDivisionError:
print("There are no students!")
give_oranges()
На этот раз, если учеников нет, мы увидим, как выполняется блок исключений и "Там не студенты! на экране.
Теперь, когда мы четко знаем, где именно использовать try-catch, давайте намеренно допустим ошибку и поместим само определение функции в try catch, но не в оператор, в котором мы ее вызвали.
number_of_oranges = 40
total_students = 0
try:
def give_oranges():
orange_for_each = number_of_oranges/total_students
return orange_for_each
except ZeroDivisionError:
print("There are no students!")
give_oranges()
На этот раз также возникает ошибка, но выглядит странно:
Traceback (most recent call last):
File "main.py", line 11, in <module>
give_oranges()
File "main.py", line 6, in give_oranges
orange_for_each = number_of_oranges/total_students
ZeroDivisionError: division by zero
Кажется, что наш блок исключений не был выполнен, как мы ожидали. Ошибка возникла с того места, где была вызвана функция. Вот объяснение: когда интерпретатор Python читал до последней строки, он уже знал, что делает метод give_oranges (), и знал, что делать, если определение этой функции не сработало. Определение функции было абсолютно правильным, поэтому ошибки не возникало, и в блоке исключений не было ни одной ошибки ZeroDivisionError. Только когда мы позже использовали эту функцию, ошибка возникла снова, но на этот раз не было блока try-кроме, чтобы поймать точное выражение.
В вашем случае вы пытаетесь охватить некоторые определения, а не где вы на самом деле называете эти определения. Ошибка возникает, но не улавливается вами должным образом, она обрабатывается некоторыми встроенными механизмами в Python классах. Извините за то, что вы перешли за рамки примеров и не указали на ошибку в вашем коде напрямую, но теперь вы должны лучше понять, где не использовать try-excepts и где правильно его использовать.