Python处理名称错误异常

0 投票
3 回答
1480 浏览
提问于 2025-04-18 08:27

我写了一段小代码,试着处理名字错误的异常。我想在出现异常的时候打印一条自定义的消息,但结果却显示了完整的错误追踪信息。

#!/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 时。变量 amain 的局部范围内并不存在,所以 Python 会去找一个叫 a 的全局变量。但它没有找到,于是就报了一个 NameError 的错误。

0

在你尝试捕捉一个异常的时候,你写了 equaldigits(a, 0)。解释器看到 a,以为它是一个不存在的变量,所以就抛出了一个未被捕捉的异常。为了测试你的 try/catch,你需要像这样传递字母 a

equaldigits('a', 0)
            ^ ^ note the quotes

撰写回答