<p>有一些一般性的建议可以遵循</p>
<ul>
<li>在可能修复的位置捕获错误</li>
<li>即使可能,也不要忽略异常(no<code>except: pass</code>)</li>
<li>记录它们</li>
<li>不要使用太宽泛的情况,如<code>except:</code>或<code>except Exception:</code></li>
<li>对不同的异常类型使用不同的异常块</li>
<li>必要时使用<code>else</code>和<code>finally</code></li>
<li>异常是一种异常行为,不要将其视为逻辑行为
应用程序的一部分</li>
</ul>
<p>这里有一个关于异常处理的<a href="http://www.jeffknupp.com/blog/2013/02/06/write-cleaner-python-use-exceptions/" rel="nofollow">good article</a><a href="https://docs.python.org/2/howto/doanddont.html#except" rel="nofollow">Python docs</a>也有最佳做法。和一个<a href="http://eli.thegreenplace.net/2008/08/21/robust-exception-handling/" rel="nofollow">from the past</a>(但仍然具有有效信息)</p>
<p>考虑到捕捉它们的地点。嗯,这里有不同的可能性</p>
<ol>
<li><p>在代码中的任何其他地方都不能使用这些函数。<br/>
在这种情况下,考虑这个问题的目的是“我需要通知用户出了什么问题,仅此而已”。在这种情况下,可以在可能的最高级别捕获异常</p></li>
<li><p>当这些函数在代码中广泛使用时,您需要一种不同的方法。在您这样做时引发异常,并在可以执行任何操作以返回正常程序执行(如果这是所需的行为)的位置捕获异常。或者,有时需要重新引发异常。例如:</p>
<pre><code>try:
credential_json = Database.getCredential(username)
except LookupError as le:
log.warning(le)
renew_token() # (example) try to fix the problem somehow
credential_json = Database.getCredential(username) # retry
# note, that the next possible LookupError is not handled here.
finally:
check_data(credential_json)
return credential_json
</code></pre></li>
<li><p>您正在编写可重用代码。这种情况很复杂。A.
需要深入了解您的工作流程。您的代码必须
提供自定义异常、异常处理程序,可以轻松
重写、控制返回值、提供回退等</p>
<pre><code>def function_with_handler(data, error_handler=_handler, *args, **kwargs):
try:
do_stuff()
except CustomError as such_problem:
# log.level(such_problem)
_handler(such_problem, data, *args, **kwargs)
</code></pre></li>
</ol>
<p>此外,有时向<code>fail_silently = True</code>添加一个选项实际上是一个好主意</p>
<p>阅读大型项目的源代码通常是一个好的做法。例如,看看<code>Django</code>如何处理<a href="https://github.com/django/django/blob/master/django/core/exceptions.py" rel="nofollow">exceptions</a></p>