gpt4 book ai didi

python3 使用自定义属性重新引发异常?

转载 作者:太空狗 更新时间:2023-10-29 21:34:54 24 4
gpt4 key购买 nike

这是我需要移植的 python2 代码:

try:
do_something_with_file(filename)

except:
exc_type, exc_inst, tb = sys.exc_info()
exc_inst.filename = filename
raise exc_type, exc_inst, tb

使用上面的代码,我可以通过检查异常是否具有“文件名”属性来获取有问题的输入文件的整个异常。

但是 python3 的 raise 已经改变了。这是 2to3 给我的上述代码:

except Exception as e:
et, ei, tb = sys.exc_info()
e.filename = filename
raise et(e).with_traceback(tb)

这给了我另一个错误,我不认为文件名属性被保留:

in __call__
raise et(e).with_traceback(tb)
TypeError: function takes exactly 5 arguments (1 given)

我只是想要透明地传递异常和一些信息来跟踪输入文件。我想念 python2 的 raise [exception_type[,exception_instance[,traceback]]] - 我如何在 python3 中执行此操作?

最佳答案

您可以设置 __traceback__ 属性:

except Exception as e:
et, ei, tb = sys.exc_info()
ei.filename = filename
ei.__traceback__ = tb
raise ei

或直接在旧实例上调用 .with_traceback():

except Exception as e:
et, ei, tb = sys.exc_info()
ei.filename = filename
raise ei.with_traceback(tb)

但是,回溯已经自动附加,真的不需要重新附加。

参见 raise statement documentation :

A traceback object is normally created automatically when an exception is raised and attached to it as the __traceback__ attribute, which is writable.

在这种特定情况下,也许您想要一个不同的异常,并带有上下文?

class FilenameException(Exception):
filename = None
def __init__(self, filename):
super().__init__(filename)
self.filename = filename

try:
something(filename)
except Exception as e:
raise FilenameException(filename) from e

这将创建一个链式异常,如果未捕获,将打印两个异常,并且原始异常可用作 newexception.__context__

关于python3 使用自定义属性重新引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15838224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com