在 Python 3 中捕获特定的 OSError 异常

Catch a Specific OSError Exception in Python 3

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

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

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

完整的错误信息是:

Caught OSError: [Errno12] Cannot allocate memory

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

您可以使用 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

某些错误编号可能因平台而异(参见 this comparison). Therefore, I would recommend using the errno 模块,以便以 cross-platform 方式捕获特定类型的 OSError:

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

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

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

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