异常消息(Python 2.6)

35 投票
4 回答
83958 浏览
提问于 2025-04-15 15:54

在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:
    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 个回答

9

Python有一个叫做traceback的模块。

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

如果你想获取异常对象,也就是被异常传递的那个对象,最好从Python 2.6开始使用新的格式(目前这两种格式都支持),因为在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的新特性文档中找到详细的概述。

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()

撰写回答