【问题标题】:Catch a Specific OSError Exception in Python 3在 Python 3 中捕获特定的 OSError 异常
【发布时间】:2020-12-06 05:18:03
【问题描述】:

在 Python 3 中,我们如何捕获特定的 OSError 异常?

我当前的代码捕获所有OSError,但只需要捕获OSError: [Errno 12]

try:
    foo()
except OSError as e:
    print('Caught OSError: [Errno12]')

完整的错误信息是:

捕获的 OSError: [Errno12] 无法分配内存

我们怎样才能让 Python 只捕获 OSErrorErrno12 变体?

【问题讨论】:

    标签: python python-3.x ubuntu error-handling try-except


    【解决方案1】:

    您可以使用OSErrorerrno 属性。对于错误:

    >>> raise OSError(12, 'Some Error')
    Traceback (most recent call last):
    
      File "<ipython-input-5-8a046f16ebb6>", line 1, in <module>
        raise OSError(12, 'Some Error')
    
    OSError: [Errno 12] Some Error
    

    使用以下内容:

    try:
        raise OSError(12, 'Some Error')
    except OSError as e:
        if e.errno == 12:
            print('OSError no. 12 caught')
        else:
            raise
    
    # Output:
    # OSError: [Errno 12] Some Error
    

    【讨论】:

    • 很好的答案,但如果不是 Errno12,他们可能想“提高”而不是“继续”,因此有效地只捕获 Errno12。
    • @TamirIlan 已编辑。当然,当条件不满足时,OP 可以决定他们想要做什么。
    【解决方案2】:

    某些错误编号可能因平台而异(参见例如this 比较)。因此,我建议使用errno 模块,以便以跨平台的方式捕获特定类型的 OSError:

    try:
        # Code that might fail...
    except OSError as e:
        if e.errno == errno.ENOMEM:
            # Handle ENOMEM case...
        else:
            raise
    

    您可以使用字典errno.errocode 查找errno 模块中特定错误代码的名称:

    >>> errno.errorcode[12]
    'ENOMEM'
    

    请注意,错误编号 12 在大多数平台上似乎都是相同的,但在许多其他平台上却有所不同。

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多