擅长:python、mysql、java
<p>如果代码需要一个特定的接口,而用户传递的对象没有该接口,那么十有八九,捕捉异常是不合适的。大多数情况下,当涉及到接口不匹配时,<code>AttributeError</code>不仅是合理的,而且是预期的。</p>
<p>有时,捕捉<code>AttributeError</code>可能是合适的,原因有两个。要么您希望接口的某些方面是可选的,要么您希望抛出一个更具体的异常,也许是一个包特定的异常子类。当然,如果您没有诚实地处理错误和任何后果,就不应该阻止抛出异常。</p>
<p>所以在我看来,这个问题的答案必须是特定于问题和领域的。从根本上讲,问题是使用<code>Cow</code>对象而不是<code>Duck</code>对象是否应该工作。如果是的话,你可以处理任何必要的接口伪造,那就没问题了。另一方面,没有理由显式检查是否有人向您传递了一个<code>Frog</code>对象,除非这将导致灾难性的失败(即比堆栈跟踪更糟糕的情况)。</p>
<p>也就是说,记录你的界面总是一个好主意——这就是docstring(以及其他东西)的用途。当您考虑这个问题时,在大多数情况下抛出一个一般性错误并告诉用户在docstring中正确的操作方法比试图预见用户可能犯下的每个错误并创建一个自定义错误消息要高效得多。</p>
<p>最后一个警告——你可能在这里考虑的是<em>UI</em>——我认为这是另一个故事。最好检查最终用户提供给您的输入,以确保它不是恶意的或严重畸形的,并提供有用的反馈,而不是堆栈跟踪。但是对于库或类似的东西,您必须信任程序员使用您的代码来智能地、尊重地使用它,并理解Python生成的错误。</p>