2013-10-17 21 views

回答

4

第一个从再次提升的点重新写入异常的堆栈跟踪,因此它显示在行raise err处已经被提出。第二个单独离开堆栈跟踪,所以它显示在<some code>的某个地方被提出。

+5

请注意,区别在于'raise'语句,而不是'except'语句。即使你已经完成了'SomeException as err:',你仍然可以使用“anonymous”'raise'来传递异常。 – abarnert

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 
0

是的。 except SomeException as err会让那么你在那个异常对象的函数调用,如本教程的代码片段显示:

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

然后,您可以再次加注其在任一片段。