Python处理名称错误异常
我写了一段小代码,试着处理名字错误的异常。我想在出现异常的时候打印一条自定义的消息,但结果却显示了完整的错误追踪信息。
#!/usr/bin/python -tt
import logging
def equaldigits(a, b):
logging.basicConfig(filename='run.log',level=logging.INFO)
try:
c = a - b
logging.info('%s is the difference between both the digits', str(c))
print c
return c
except NameError as e:
c = 'Unable to successfully complete execution'
logging.info(c)
print c
#return c
def main():
print '\n1st call'
equaldigits(10, 10)
print '\n2nd call'
equaldigits(1, 0)
print '\nException call'
equaldigits(a, 0)
# Standard boilerplate to call the main() function.
if __name__ == '__main__':
main()
这是控制台的输出结果
1st call
0
2nd call
1
Exception call
Traceback (most recent call last):
File "./sut.py", line 28, in <module>
main()
File "./sut.py", line 24, in main
equaldigits(a, 0)
NameError: global name 'a' is not defined
3 个回答
0
你的错误是因为在你调用 equaldigits 的时候,变量 a 还没有定义,所以程序没有进入函数里面的 try/except 这部分。
当你把
a - b
改成
a - d
之后,你会发现你的 try/except 运行得很好。
0
问题并不是出在你的 equaldigits
函数里,那里有你的日志信息。
问题发生在你的 main
函数中,当解释器试图把 a
的值传递给 equaldigits
时。变量 a
在 main
的局部范围内并不存在,所以 Python 会去找一个叫 a
的全局变量。但它没有找到,于是就报了一个 NameError
的错误。
0
在你尝试捕捉一个异常的时候,你写了 equaldigits(a, 0)
。解释器看到 a
,以为它是一个不存在的变量,所以就抛出了一个未被捕捉的异常。为了测试你的 try/catch,你需要像这样传递字母 a
equaldigits('a', 0)
^ ^ note the quotes