Проблема с выводом finally при переборе except
Всем привет,
Не могу понять, почему интерпретатор не ставит finally в приоритет и не выводит его, даже если возникла ошибка?
Программа принимает два аргумента и делит один на другой. Пытаюсь поймать исключения и вывести их значение в текстовом формате. И в любом случае выводится условия finally.
Пример кода:
def separator(num_1, num_2):
try:
ans = num_1 / num_2
return ans
except ZeroDivisionError as e:
print(f'ай яй, яй делить на ноль можно не многим__', e)
except TypeError as e:
print(f'Ну и как ты собрался делить числа и строки?__', e)
except NameError as e:
print(f'Непонятный символ__', e)
finally:
print("I'm happy that you learn python")
print(separator(10, p))
Если указать к примеру любое значение, интерпретатор выдает NameError. И по идее должен вывести finally. И то, что в одном из except было указано за NameError, но условие except с NameError даже не проходит debug.
Заранее благодарю за помощь в понимании где была допущена ошибка.
Ответы (1 шт):
Если вы про то, что интерпретатор ругается на неизвестную переменную p:
print(separator(10, p))
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-230-e9f4a0378cef> in <module>
12 print("I'm happy that you learn python")
13
---> 14 print(separator(10, p))
NameError: name 'p' is not defined
То тут ведь до вызова функции separator ход и не доходит, и поэтому блок try/except/finally, который расположен внутри функции separator просто не выполняется. Питон не понимает, что такое p и не может вызвать функцию separator - ведь неизвестно, какие аргументы ей нужно передавать.
Если хотите поймать ошибку именно в этой строке, то и нужно именно её окружать конструкцией try/except/finally:
try:
print(separator(10, p))
except NameError as e:
print(f'Непонятный символ__', e)
finally:
print("I'm happy that you learn python")
Вывод:
Непонятный символ__ name 'p' is not defined
I'm happy that you learn python