<p>我意识到这个问题已经出现了一段时间,但是一旦你足够幸运地只支持Python3.x,这真的就变成了一件美妙的事情:)</p>
<h3>从</h3>
<p>我们可以使用<a href="https://docs.python.org/3/reference/simple_stmts.html#raise">raise from</a>链接异常。</p>
<pre class="lang-python prettyprint-override"><code>try:
1 / 0
except ZeroDivisionError as e:
raise Exception('Smelly socks') from e
</code></pre>
<p>在这种情况下,调用者将捕获的异常具有引发异常的地方的行号。</p>
<pre class="lang-none prettyprint-override"><code>Traceback (most recent call last):
File "test.py", line 2, in <module>
1 / 0
ZeroDivisionError: division by zero
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "test.py", line 4, in <module>
raise Exception('Smelly socks') from e
Exception: Smelly socks
</code></pre>
<p>请注意,底部异常仅具有引发异常的stacktrace。调用方仍然可以通过访问它们捕获的异常的<code>__cause__</code>属性来获取原始异常。</p>
<h3>带回溯</h3>
<p>或者你可以使用<a href="https://docs.python.org/3/library/exceptions.html#BaseException.with_traceback">with_traceback</a>。</p>
<pre class="lang-python prettyprint-override"><code>try:
1 / 0
except ZeroDivisionError as e:
raise Exception('Smelly socks').with_traceback(e.__traceback__)
</code></pre>
<p>使用此表单,调用者将捕获的异常具有原始错误发生位置的回溯。</p>
<pre class="lang-none prettyprint-override"><code>Traceback (most recent call last):
File "test.py", line 2, in <module>
1 / 0
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test.py", line 4, in <module>
raise Exception('Smelly socks').with_traceback(e.__traceback__)
File "test.py", line 2, in <module>
1 / 0
Exception: Smelly socks
</code></pre>
<p>请注意,底部的异常有执行无效除法的行和重新引发异常的行。</p>