Проблема с выводом 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 шт):

Автор решения: CrazyElf

Если вы про то, что интерпретатор ругается на неизвестную переменную 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
→ Ссылка