提出命名和未命名异常之间的区别

时间:2013-10-17 23:36:39

标签: python exception-handling

以下是否存在差异?

try:
    <some code>
except SomeException as err:
    raise err

try:
    <some code>
except SomeException:
    raise

3 个答案:

答案 0 :(得分:4)

第一个从重新引发的点​​重写异常的堆栈跟踪,因此它显示为已在行raise err处引发。第二个单独留下堆栈跟踪,因此它显示为已在<some code>中的某处生成。

答案 1 :(得分:0)

According to the documentation,仅使用raise语句重新引发当前作用域中活动的最后一个异常。 raise err解析err[, None, None]并确定需要提出err

这意味着第一个版本(raise err)会将raise err行作为堆栈跟踪的基础。裸raise语句熄灭并重新引发最后一个错误而不触及它,这会保留原始堆栈跟踪。

# raise err
Traceback (most recent call last):
  File "foo.py", line 4, in <module>
    raise err
Exception: bar

# raise
Traceback (most recent call last):
  File "foo.py", line 2, in <module>
    raise Exception('bar')
Exception: bar

答案 2 :(得分:0)

是。 except SomeException as err将允许您调用该异常对象的函数,如本教程片段所示:

except IOError as e:
  print "I/O error({0}): {1}".format(e.errno, e.strerror)

然后,您可以在任一代码段中重新加载它。