在使用异常来表示错误的语言中,我想调用一些第三方代码,如果失败,则运行回退代码。例如:
try:
result = third_party.fast_calculation()
catch:
result = slower_calculation()
以我的经验,了解第三方代码可能引发的所有异常是非常罕见的。因此我不能在catch
条款中列出这些例外。另一方面,我经常被建议不要出现catch
所有可能的例外情况。
在这种情况下我应该如何写catch
子句?
在使用异常来表示错误的语言中,我想调用一些第三方代码,如果失败,则运行回退代码。例如:
try:
result = third_party.fast_calculation()
catch:
result = slower_calculation()
以我的经验,了解第三方代码可能引发的所有异常是非常罕见的。因此我不能在catch
条款中列出这些例外。另一方面,我经常被建议不要出现catch
所有可能的例外情况。
在这种情况下我应该如何写catch
子句?
只有当您有特定的方法来处理它们时,您才应该捕获特定的异常类型。您可以(并且应该)以最合适的顺序捕获尽可能多的特定类型的异常。
如果您只想以同样的方式处理每个异常,我相信您当前的、无类型的 catch 和它一样好。真正的问题,IMO,出现在你留下一个空的 catch 时,因为客户端代码无法知道函数是否真的做了它应该做的事情。
首先,检查您的第三方代码是否确实引发了异常。它可能不会。
其次,检查第三方代码是否没有抛出异常的返回结果。可以返回状态值以指示是否获得了成功的结果。如果是这样,可能需要进行状态检查以确定在返回错误状态后是否需要恢复操作(例如,使用“slower_calculation”方法)。