Ошибка имени Python: имя не определено, но не может зафиксировать ошибку

#python #nameerror

#python #ошибка имени

Вопрос:

 def strornum(a):
    try:
        return(a/1)
    except Exception:
        return("ERROR")
    
bob=strornum("W")
print(bob)
 

Это дает мне правильную ошибку «ОШИБКА»

 def strornum(a):
    try:
        return(a/1)
    except Exception:
        return("ERROR")
    
bob=strornum(W)
print(bob)
 

Это не обрабатывается и выдает мне «ошибка имени: имя ‘W’ не определено»
Мне нужно зафиксировать эту ошибку

Есть идеи?

Комментарии:

1. Вокруг использования нет try / except W , просто поместите bob=strornum(W) его, но это бессмысленно, потому что переменная определяется или нет при написании скрипта, за исключением случаев, когда переменная определена в if блоке <<== в этом случае возникает ошибка в else . Не используйте NameError для выполнения кода

2. Или объясните, почему вы считаете, что вам нужно это уловить

3. Ошибка возникает перед вызовом функции. Как a try внутри функции может ее перехватить?

4. "W" означает односимвольную строку, которая имеет a W для своего единственного символа. W означает переменную с именем W , которая, очевидно, не определена. Не должно быть необходимости перехватывать ошибки имени, потому что вы уже должны знать, какие имена определены в вашем коде, когда вы его кодируете.

5. @PranavHosangadi Он это знает. Он просто хочет, чтобы он try/except перехватил ошибку из неопределенной переменной.

Ответ №1:

То, что вы хотите, невозможно.

При вызове функции все аргументы вычисляются до выполнения кода в функции. Python не ждет, пока вы не обратитесь к переменной параметра внутри функции (есть некоторые языки, которые это делают, это называется «отложенная оценка»).

Таким образом, ошибка возникает в вызывающем коде перед вводом вашего try/except блока, поэтому он не может ее там перехватить.

Ответ №2:

Запуск кода с ошибкой выдает сообщение об обратном отслеживании

 Traceback (most recent call last):
  File "test.py", line 7, in <module>
    bob=strornum(W)
NameError: name 'W' is not defined
 

Ошибка возникла при попытке вызвать функцию, а не в самой функции. W не определено в точке вызова. Решение состоит в том, чтобы добавить другой обработчик исключений на этом уровне.

 def strornum(a):
    try:
        return(a/1)
    except Exception:
        return("ERROR")

try:
    bob=strornum(W)
    print(bob)
except Exception:
    print("Outer Error")
 

обязательное предупреждение: перехват всех исключений обычно не является хорошей идеей, поскольку это может замаскировать реальные проблемы с вашим кодом.