【发布时间】:2013-11-17 09:45:41
【问题描述】:
在系统编程中,调用一些可能失败的库函数是很常见的,如果确实失败了,请检查errno 的确切原因。即使在 Python 中也是如此,我认为它比它需要的更麻烦。让我们以一些尝试删除文件的代码为例,如果文件不存在,则继续静默:
try:
sftp.unlink(path)
except IOError as ex:
if ex.errno != errno.ENOENT:
raise
我想知道在 Python 中是否曾允许或建议做类似这样的事情:
try:
sftp.unlink(path)
except IOError as ex if ex.errno == errno.ENOENT:
pass
我觉得这里有几点值得推荐:
- 更简洁。
- 熟悉:因为我们已经可以捕获某些类型的异常,所以我们只捕获某些实际实例。未捕获的异常以通常的方式传播。
- 不需要新的关键字,也不需要任何主要的新句法结构。
如果以前没有考虑过这一点,我会感到惊讶,因此我会接受任何指向过去或未决提案的链接作为答案。我也接受一个答案,解释为什么上面会引入现有语言的任何问题(Python 3.x,因为我认为 2.x 大部分是冻结的)。
【问题讨论】:
-
我觉得这是个好主意,但它根本不符合本站的格式,而且它还邀请讨论,因为这个无法回答,并且是自以为是的。
-
检查它是否尚未被提议的最佳地点是检查PEPs(如果它已被正式提议/拒绝)和Python Ideas List 进行任何讨论......这也是值得的参考:Python List和Python Developer's List
-
从 Python3.4+ 开始有一个官方的解决方法:
contextlib.suppress(*exceptions)docs.python.org/dev/library/contextlib.html#contextlib.suppress 我认为它比 if 语句与 except 混合更好 -
@InbarRose:我在问题中明确说明了如何回答:带有指向 PEP(我找不到)或其他提案文件的链接,或者带有一些关于它如何破坏的技术解释语言。除非两者兼而有之,最好的答案是最终以新的 PEP 结束,或者可能是一些代码显示了更好的方法。如果您有另一个 StackExchange 站点,我应该在上面发布此内容,请告诉我。
标签: python exception python-3.x exception-handling pep