在 Python 中,捕获“所有”异常的最佳方法是什么?
except: # do stuff with sys.exc_info()[1]
except BaseException as exc:
except Exception as exc:
catch 可能正在线程中执行。
我的目标是记录普通代码可能引发的任何异常,而不掩盖任何特殊的 Python 异常,例如那些指示进程终止等的异常。
获取异常的句柄(例如通过上面包含的子句exc
)也是可取的。
在 Python 中,捕获“所有”异常的最佳方法是什么?
except: # do stuff with sys.exc_info()[1]
except BaseException as exc:
except Exception as exc:
catch 可能正在线程中执行。
我的目标是记录普通代码可能引发的任何异常,而不掩盖任何特殊的 Python 异常,例如那些指示进程终止等的异常。
获取异常的句柄(例如通过上面包含的子句exc
)也是可取的。
except Exception:
与except BaseException:
:
Exception
捕获和的区别在于BaseException
,根据异常层次结构异常,如 SystemExit、KeyboardInterrupt 和 GeneratorExit 在使用时不会被捕获,except Exception
因为它们直接继承自BaseException
.
except:
与except BaseException:
:
这两者之间的区别主要在python 2(AFAIK)中,并且只有在使用旧样式类作为要引发的异常时,在这种情况下,只有无表达式的 except 子句才能捕获异常,例如。
class NewStyleException(Exception): pass
try:
raise NewStyleException
except BaseException:
print "Caught"
class OldStyleException: pass
try:
raise OldStyleException
except BaseException:
print "BaseException caught when raising OldStyleException"
except:
print "Caught"
如果您需要捕获所有异常并为所有人执行相同的操作,我会建议您这样做:
try:
#stuff
except:
# do some stuff
如果您不想屏蔽“特殊”python 异常,请使用 Exception 基类
try:
#stuff
except Exception:
# do some stuff
对于一些异常相关的管理,明确地捕获它们:
try:
#stuff
except FirstExceptionBaseClassYouWantToCatch as exc:
# do some stuff
except SecondExceptionBaseClassYouWantToCatch as exc:
# do some other stuff based
except (ThirdExceptionBaseClassYouWantToCatch, FourthExceptionBaseClassYouWantToCatch) as exc:
# do some other stuff based
python 文档中的异常层次结构应该是有用的阅读材料。
为了避免掩盖基本异常,您需要“重新引发”任何不是您明确要处理的异常,例如(改编自8. Errors and Exceptions):
导入系统尝试: # 做一些可能引发异常的事情: 除了 IOError 为 (errno, strerror): print "I/O 错误({0}): {1}".format(errno, strerror) 除了ValueError: print "无法将数据转换为整数。" 除了: # 可能会记录异常(例如在调试模式下) # 重新引发异常: 增加