在 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 只捕获 OSError
的 Errno12
变体?
您可以使用 OSError
的 errno
属性。对于错误:
>>> 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.errocode
在 errno
模块中查找特定错误代码的名称:
>>> errno.errorcode[12]
'ENOMEM'
请注意,错误编号 12 在大多数平台上似乎都是相同的,但许多其他平台有所不同。
在Python 3中,我们如何捕获特定的OSError
异常?
我当前的代码捕获所有 OSError
,但只需要捕获 OSError: [Errno 12]
。
try:
foo()
except OSError as e:
print('Caught OSError: [Errno12]')
完整的错误信息是:
Caught OSError: [Errno12] Cannot allocate memory
我们怎样才能让 Python 只捕获 OSError
的 Errno12
变体?
您可以使用 OSError
的 errno
属性。对于错误:
>>> 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.errocode
在 errno
模块中查找特定错误代码的名称:
>>> errno.errorcode[12]
'ENOMEM'
请注意,错误编号 12 在大多数平台上似乎都是相同的,但许多其他平台有所不同。