python中用来回溯异常的模块_Python中的“内部异常”(带回溯)?

Python 3有^{} ... ^{} clause来链接异常。Glenn's answer对于Python 2.7来说是很好的,但是它只使用原始异常的回溯并丢弃错误消息和其他细节。以下是Python2.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

这种风格的^{} statement将异常类型作为第一个表达式,将元组中的异常类构造函数参数作为第二个表达式,将回溯作为第三个表达式。如果您运行的时间早于Python 2.2,请参见^{}上的警告。

任何异常类型

下面是另一个例子,如果您不知道您的代码可能要捕获什么样的异常,那么这个例子更通用。缺点是它丢失了异常类型,只会引发运行时错误。您必须导入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

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()的行,但是异常消息现在包括命令行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值