是否有任何关于条件“例外”块的 Python 提案? [关闭]

Posted

技术标签:

【中文标题】是否有任何关于条件“例外”块的 Python 提案? [关闭]【英文标题】:Has there been any Python proposal for conditional "except" blocks? [closed] 【发布时间】: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 站点,我应该在上面发布此内容,请告诉我。 通过引入FileNotFoundError解决,见pep 3151 Reworking the OS and IO exception hierarchy 【参考方案1】:

我怀疑你会在这个建议中走得更远,但你可以通过上下文管理器得到你想要的。试试这个:

import os

class SuppressOSError(object):
    def __init__(self, *valid_errno):
        self.valid_errno = valid_errno

    def __enter__(self):
        return self

    def __exit__(self, ex_type, ex_value, traceback):
        if issubclass(ex_type, OSError) and ex_value.errno in self.valid_errno:
            return True # suppress exception

with SuppressOSError(os.errno.ENOENT):
    os.remove('/tmp/no_such_file')
    print("This line will not be reached.")
print("An exception was not raised.")

上面打印“未引发异常。”

您可以传入任意数量的errno 值;在我的例子中,我只是通过了一个。在 Python 2.7.4 中测试,应该可以在任何 Python 2.5 或更高版本中运行。

【讨论】:

感谢您向我们展示了这个技巧,但我不得不说,我可能永远不会使用它,因为它比天真的解决方案复杂得多(新维护者更难遵循,代码更多)。 它更难实现,但易于使用。而且你不必实施它,因为我只是把它给了你。恕我直言,这是解决您问题的最佳方法;它正在使用该语言现在支持的功能(并且从 2.5 开始就有)。总的来说,Python 正朝着这个方向发展。查看contextlib 的文档并在此处查找contextlib.suppress():docs.python.org/dev/library/contextlib.html 您将无法成功获得对语言的建议更改。类似的东西已经被讨论过了,并且不受欢迎。 Python 开发社区在向语言中添加新东西时非常谨慎,他们不会在没有充分理由的情况下这样做。新重构的异常在 3.3 和更新版本中解决了大部分问题,而我的解决方案在 2.5 和更新版本中有效,所以我认为没有足够的问题来支持对语言的更改。

以上是关于是否有任何关于条件“例外”块的 Python 提案? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

ECMAScript 提案阶段

三法则的例外?

用于多个同步块的Java

Python基础-条件语句(判断)

Go语言团队否决关于"try()"语句的提案

如果在文件末尾省略PHP块的结束标记,是否会删除任何换行符或空格(如果存在于相应的文件中)?