擅长:python、mysql、java
<p>我见过两个成语:</p>
<blockquote>
<p>With <code>finally</code></p>
</blockquote>
<pre><code>exit_code = None
try:
do_something()
except CustomError1:
exit_code = 1
except CustomError2:
exit_code = 2
finally:
if exit_code is not None:
send_error_mail(exit_code)
</code></pre>
<blockquote>
<p>With <a href="https://alysivji.github.io/quick-hit-dictionary-dispatch.html" rel="nofollow noreferrer">"dictionary dispatch"</a></p>
</blockquote>
<pre><code>try:
do_something()
except Exception as e:
code = {
CustomError1: 1
CustomError2: 2
}.get(type(e))
if code is None:
raise
send_error_email(code)
</code></pre>
<p>(或者如果你想全速前进<a href="https://www.python.org/dev/peps/pep-0572/" rel="nofollow noreferrer">^{<cd1>}</a>)</p>
<pre><code> ...
if (code := {
CustomError1: 1
CustomError2: 2
}.get(type(e))) is not None:
send_error_email(code)
raise
</code></pre>
<hr/>
<p>但是,如果您<em>控制</em>您的异常(它们不是库异常)——我也喜欢@scnerd的解决方案。如果你不想——并且想抓住<code>ValueError</code>或<code>TypeError</code>或其他什么,那么其中一个就是要走的路</p>