异常信息(Python 2.6)

35

在Python中,如果我打开一个不存在的二进制文件,程序会因为错误而退出并打印:

Traceback (most recent call last):
  File "C:\Python_tests\Exception_Handling\src\exception_handling.py", 
  line 4, in <module>
  pkl_file = open('monitor.dat', 'rb')
  IOError: [Errno 2] No such file or directory: 'monitor.dat'

我可以用'try-except'来处理这个问题,例如:

try:
    pkl_file = open('monitor.dat', 'rb')
    monitoring_pickle = pickle.load(pkl_file)
    pkl_file.close()
except Exception:
    print 'No such file or directory'

在捕获异常时,如何打印以下行?

File "C:\Python_tests\Exception_Handling\src\exception_handling.py", 
line 11, in <module>
pkl_file = open('monitor.dat', 'rb')

所以程序不会退出。

4个回答

90

这将打印异常信息:

except Exception, e:
    print "Couldn't do it: %s" % e

这将显示完整的回溯信息:
import traceback

# ...

except Exception, e:
    traceback.print_exc()

但是你可能不想捕获所有异常。通常来说,你能够缩小捕获范围就越好。因此,你可能想尝试:

except IOError, e:

相反,如果你只关心文件丢失的情况,那么仅在打开文件时使用try-except:

try:
    pkl_file = open('monitor.dat', 'rb')
except IOError, e:
    print 'No such file or directory: %s' % e

monitoring_pickle = pickle.load(pkl_file)
pkl_file.close()

@Josh,那个回答与这个回答说的差不多。 - David Heffernan

22

如果您想捕获由异常传递的异常对象,则最好开始使用Python 2.6引入的NEW格式(目前两种格式都支持),因为这将是Python 3中唯一的方法。

这就是:

try:
    ...
except IOError as e:
    ...

示例:

try:
    pkfile = open('monitor.dat', 'rb')
except IOError as e:
    print 'Exception error is: %s' % e

可以在Python 2.6文档的新特性说明中找到详细的概述。


2
有帮助,但这并没有回答问题。或许作为评论更好? - Josh

9

Python has the traceback module.

import traceback
try:
    pkl_file = open('monitor.dat', 'rb')
    monitoring_pickle = pickle.load(pkl_file)
    pkl_file.close()
except IOError:
    traceback.print_exc()

6
感谢一切。
这正是我所需要的 :)
import traceback

try:
    # boom
except Exception:
    print traceback.format_exc()

8
评论时不应该创建回答。请接受一个答案以奖励你的帮手! - Ned Batchelder
请花些时间重新审视Ned B的答案。他提出了几个重要的观点,不仅解决了您当前的问题。 - PaulMcG
谢谢,保罗,但我感觉我们已经到达了这个问题的活动结束点... - Ned Batchelder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接