NameError Обработка в Python - PullRequest
       41

NameError Обработка в Python

0 голосов
/ 19 апреля 2020

Я новичок в python, и у меня возникли некоторые трудности с пониманием того, почему {попробуй ... кроме} хорошо работал с кодом ниже:

try:
   print(x)
except NameError:
   print('variable x is not defined')

, но он не работал с кодом ниже :

def divide(x, y):
    try:
        result = x / y
    except (ZeroDivisionError, NameError):
        print("division by zero!")
    except NameError:
        print('only numeric values')
    else:
        return result
        # print("result is", result)

print(divide(4,f))

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

В вашем коде есть несколько проблем.

Как есть, NameError будет увеличено на:

print(divide(4,f))

, потому что нет f.

Вы должны обработать исключение, когда оно поднято, например:

try:
    print(divide(4,f))
except NameError:
    print('variable f is not defined')

Теперь, когда вы посмотрите на саму функцию, эта строка:

except (ZeroDivisionError, NameError):

означает, что следующий блок будет выполнен когда ZeroDivisionError или NameError поднят. Таким образом, следующее:

except NameError:

никогда не получает играть. И сообщение вроде подсказывает, что вы, возможно, искали что-то вроде TypeError. Например, когда вы хотели получить число, но получили, например, str.

и NameError, то есть, по сути, переменную, которая не определена, вы никогда (OK, если вы не del ее) не увидите, что она обращается к x или y в функции, которая принимает эти два аргумента. Вы могли бы видеть TypeError вызывающим его без ожидаемого позиционного аргумента, но в этой функции будут присутствовать x и y.

0 голосов
/ 19 апреля 2020

Довольно сложно увидеть (вы должны исправить форматирование разделов кода):

Во втором примере ошибка имени произойдет в строке, вызывающей функцию деления, которая находится вне любого обработчика исключений.

...