python如何关闭异常自动关联上下文-亚博电竞手机版

python如何关闭异常自动关联上下文

这篇文章将为大家详细讲解有关python如何关闭异常自动关联上下文,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

如何关闭异常自动关联上下文

当你在处理异常时,由于处理不当或者其他问题,再次抛出另一个异常时,往外抛出的异常也会携带原始的异常信息。

就像这样子。

try:print(1/0)exceptexceptionasexc:raiseruntimeerror("somethingbadhappened")

从输出可以看到两个异常信息

traceback(mostrecentcalllast):file"demo.py",line2,inprint(1/0)zerodivisionerror:divisionbyzeroduringhandlingoftheaboveexception,anotherexceptionoccurred:traceback(mostrecentcalllast):file"demo.py",line4,inraiseruntimeerror("somethingbadhappened")runtimeerror:somethingbadhappened

如果在异常处理程序或 finally 块中引发异常,默认情况下,异常机制会隐式工作会将先前的异常附加为新异常的 __context__属性。这就是 python 默认开启的自动关联异常上下文。

如果你想自己控制这个上下文,可以加个 from 关键字(from 语法会有个限制,就是第二个表达式必须是另一个异常类或实例。),来表明你的新异常是直接由哪个异常引起的。

try:print(1/0)exceptexceptionasexc:raiseruntimeerror("somethingbadhappened")fromexc

输出如下

traceback(mostrecentcalllast):file"demo.py",line2,inprint(1/0)zerodivisionerror:divisionbyzerotheaboveexceptionwasthedirectcauseofthefollowingexception:traceback(mostrecentcalllast):file"demo.py",line4,inraiseruntimeerror("somethingbadhappened")fromexcruntimeerror:somethingbadhappened

当然,你也可以通过with_traceback()方法为异常设置上下文__context__属性,这也能在traceback更好的显示异常信息。

try:print(1/0)exceptexceptionasexc:raiseruntimeerror("badthing").with_traceback(exc)

最后,如果我想彻底关闭这个自动关联异常上下文的机制?有什么办法呢?

可以使用 raise...from none,从下面的例子上看,已经没有了原始异常

$catdemo.pytry:print(1/0)exceptexceptionasexc:raiseruntimeerror("somethingbadhappened")fromnone$$pythondemo.pytraceback(mostrecentcalllast):file"demo.py",line4,inraiseruntimeerror("somethingbadhappened")fromnoneruntimeerror:somethingbadhappened(pythoncodingtime)

关于“python如何关闭异常自动关联上下文”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

展开全文
内容来源于互联网和用户投稿,文章中一旦含有亚博电竞手机版的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系亚博电竞手机版删除

最新文章

网站地图