是否有针对条件“除”块的Python提议?

时间:2013-11-06 08:36:21

标签: python exception python-3.x exception-handling pep

在系统编程中,通常会调用某些可能失败的库函数,如果失败,则检查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

我认为这有一些建议:

  1. 更简洁。
  2. 熟悉:因为我们已经可以捕获某些类型的异常,所以我们只捕获某些实际情况。未捕获的异常以通常的方式传播。
  3. 不需要新关键字,也不需要任何主要的新语法结构。
  4. 如果之前没有考虑到这一点,我会感到惊讶,所以我会接受任何过去或未决提案的链接。我也接受一个答案,解释为什么上面会引入现有语言的任何问题(Python 3.x,因为我认为2.x主要是冻结的)。

1 个答案:

答案 0 :(得分:0)

我怀疑你会对这个提议有所了解,但你可以通过上下文管理器得到你想要的东西。试试这个:

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或更新版本。