一尘不染

Python-我应该总是在`except`语句中指定异常类型吗?

python

使用PyCharm IDE时,使用except:无异常类型会触发IDE提醒此异常子句为Too broad

我应该忽略这个建议吗?还是总是特定于异常类型的Pythonic


阅读 648

收藏
2020-02-21

共1个答案

一尘不染

指定一个显式异常类型几乎总是更好。如果使用裸except:子句,则最终可能会捕获到你期望捕获的异常以外的异常-这可能会隐藏错误或使程序无法按预期运行时更难以调试。

例如,如果要在数据库中插入行,则可能需要捕获一个异常,该异常表明该行已存在,因此可以进行更新。

try:
    insert(connection, data)
except:
    update(connection, data)

如果指定了指标裸机except:,则还将捕获一个套接字错误,该错误指示数据库服务器已倒塌。最好只捕获你知道如何处理的异常-程序在异常发生时失败通常比继续执行但以奇怪的意外方式执行更好。

你可能希望使用裸机的一种情况except:是始终需要运行的程序的顶层,例如网络服务器。但是随后,你需要非常小心地记录异常,否则将无法找出问题所在。基本上,执行此操作的程序中最多只能有一个位置。

其推论这一切是你的代码不应该这样做raise Exception('some message'),因为它迫使客户端代码使用except:(或except Exception:这是几乎一样糟糕)。你应该定义一个特定于你要发信号的问题的异常(也许从某些内置的异常子类(如ValueErrorTypeError)继承)。或者,你应该引发特定的内置异常。这使你的代码用户可以小心地捕获他们想要处理的异常。

2020-02-21