如何更改跟踪自定义异常的显示模块?



当我尝试使用自己的包提高自定义exception时,我得到类似于以下的跟踪:

Traceback (most recent call last):
File "D:pdfshelltoolsexampleschange_error_module_mwerun_this_one.py", line 4, in <module>
raise_error()
File "D:pdfshelltoolsexampleschange_error_module_mweMyPackageMyModule.py", line 4, in raise_error
raise MyError()
MyPackage.exceptions.MyError
[Finished in 147ms]

我的问题是MyPackage.exceptions.MyError部分。我想把它改成MyPackage.MyError,感觉另一个太啰嗦了,在我的用例中没有很好的理由。这对我来说可能是错误的——如果是这样的话,我可以被说服——但是其他的包似乎不会运行到这种程度,我也希望我的包也是这样。

我已经尝试改变我的自定义异常的__module__属性,但我还没有找到一种方法来使其工作。

下面的脚本将在当前工作目录中名为change_error_module_mwe的目录中创建一个MWE。

from pathlib import Path

EXAMPLEDIR = Path('change_error_module_mwe')
PACKAGE = Path('MyPackage')
EXAMPLEDIR.mkdir(exist_ok=True)
Path(EXAMPLEDIR / PACKAGE).mkdir(exist_ok=True)
with open(EXAMPLEDIR / PACKAGE / 'MyModule.py', 'w', encoding='utf-8') as f:
f.write("""from MyPackage.exceptions import MyError
def raise_error():
raise MyError()
""")
with open(EXAMPLEDIR / PACKAGE / '__init__.py', 'w', encoding='utf-8') as f:
f.write("")
with open(EXAMPLEDIR / PACKAGE / 'exceptions.py', 'w', encoding='utf-8') as f:
f.write('class MyError(Exception):ntpassn')
with open(EXAMPLEDIR / 'run_this_one.py', 'w', encoding='utf-8') as f:
f.write('from MyPackage.MyModule import raise_errornnnraise_error()n')

如果您不希望用户看到包的内部模块的完整追溯,我认为最好的办法是在包的顶层模块上捕获它,并从None重新引发异常(这将切断整个内部追溯)。例子:

try:
open('database.sqlite')
except OSError:
raise RuntimeError from None

你可以使用这种方法,并有一个模块作为错误处理程序,所以所有的异常都会从那里抛出。

最新更新