Python 3引入了raise
... from
从句来链接异常。Glenn的回答对于Python 2.7非常好,但它只使用原始异常的回溯信息并丢弃错误消息和其他细节。以下是一些Python 2.7示例,它们将当前作用域中的上下文信息添加到原始异常的错误消息中,但保留其他细节。
已知异常类型
try:
sock_common = xmlrpclib.ServerProxy(rpc_url+'/common')
self.user_id = sock_common.login(self.dbname, username, self.pwd)
except IOError:
_, ex, traceback = sys.exc_info()
message = "Connecting to '%s': %s." % (config['connection'],
ex.strerror)
raise IOError, (ex.errno, message), traceback
这种raise
语句的味道将异常类型作为第一个表达式,异常类构造函数参数作为第二个表达式的元组,以及回溯作为第三个表达式。如果您使用的是早于Python 2.2的版本,请参阅sys.exc_info()
上的警告。
任何异常类型
这是另一个更通用的示例,如果您不知道代码可能需要捕获什么样的异常,则可以使用它。缺点是它会丢失异常类型并只引发一个RuntimeError。您必须导入traceback
模块。
except Exception:
extype, ex, tb = sys.exc_info()
formatted = traceback.format_exception_only(extype, ex)[-1]
message = "Importing row %d, %s" % (rownum, formatted)
raise RuntimeError, message, tb
修改消息
如果异常类型允许您添加上下文信息,则可以选择另一种选项。您可以修改异常的消息,然后重新引发它。
import subprocess
try:
final_args = ['lsx', '/home']
s = subprocess.check_output(final_args)
except OSError as ex:
ex.strerror += ' for command {}'.format(final_args)
raise
这将生成以下堆栈跟踪:
Traceback (most recent call last):
File "/mnt/data/don/workspace/scratch/scratch.py", line 5, in <module>
s = subprocess.check_output(final_args)
File "/usr/lib/python2.7/subprocess.py", line 566, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory for command ['lsx', '/home']
你可以看到它显示了调用
check_output()
的代码行,但异常信息现在包括命令行。