[英]python display type of raised exception
我定义我自己的异常
class MyException(Exception):
pass
在项目文件夹结构的某个深处,即 project\subfolder_1\subfolder_2\etc...\exceptions.py 然后from project.subproject.subfolder_1.subfolder_2.\etc... .exceptions import MyException as MyException
然后引发它as raise MyException('bad stuff happened')
然后在 output 中显示为
project.subproject.subfolder_1.subfolder_2.etc ... .exceptions.MyException:坏事发生
我能以某种方式摆脱完整的名称空间吗? 因为无论如何它都是“导入为”并且在代码中仅称为 MyException,所以只显示
MyException:发生了不好的事情
与其他内置异常一样?
当必须打印 Python 异常时,将调用它的__str__
方法(如果没有定义,则调用其父类的方法)。
file: so75195149/deeply_nested.py
class MyCustomException(Exception): pass
file: main.py
from so75195149.deeply_nested import MyCustomException
raise MyCustomException("bad stuff happened")
给
Traceback (most recent call last):
File "main.py", line 3, in <module>
raise MyCustomException("bad stuff happened")
so75195149.deeply_nested.MyCustomException: bad stuff happened
如果你定义了一个__str__
方法:
file: so75195149/deeply_nested.py
class MyCustomException(Exception):
def __str__(self) -> str:
return "Hello"
你得到代替
Traceback (most recent call last):
File "/home/stack_overflow/main.py", line 3, in <module>
raise MyCustomException("bad stuff happened")
so75195149.deeply_nested.MyCustomException: Hello
因为您只能选择如何打印异常,但所有 rest 都来自您的程序崩溃的事实(未捕获的异常),所以 Python 通过调用它的sys.excepthook
很好地为您提供相关信息:
这个 function 打印出给定的回溯和
sys.stderr
的异常。
当引发异常并未捕获时,解释器调用sys.excepthook
三个 arguments,异常 class,异常实例和回溯 object。 [...] 在 Python 程序中,这发生在程序退出之前。 可以通过将另一个三参数 function 分配给sys.excepthook
定义此类顶级异常的处理。
我们这里go:
file: main.py
import sys
def my_custom_excepthook(exception_class, exception_instance, traceback_object):
print(f"sys.excepthook called\n{exception_class=!r}\n{exception_instance=!s}\n{traceback_object=!s}", file=sys.stderr)
sys.excepthook = my_custom_excepthook
from so75195149.deeply_nested import MyCustomException
raise MyCustomException("bad stuff happened")
产生
sys.excepthook called
exception_class=<class 'so75195149.deeply_nested.MyCustomException'>
exception_instance=Hello
traceback_object=<traceback object at 0x7f79515fe200>
所以如果你想要一些看起来像 Python 打印的通常方式的东西,使用以前的答案:
file: main.py
import sys
import traceback
def my_custom_excepthook(exception_class, exception_instance, traceback_object):
# do not use traceback.format_exception
print("Traceback (most recent call last):", file=sys.stderr)
traceback.print_tb(traceback_object, file=sys.stderr)
print(f"{exception_class.__name__}: {exception_instance!s}", file=sys.stderr)
sys.excepthook = my_custom_excepthook
from so75195149.deeply_nested import MyCustomException
raise MyCustomException("bad stuff happened")
给
Traceback (most recent call last):
File "/home/stack_overflow/main.py", line 15, in <module>
raise MyCustomException("bad stuff happened")
MyCustomException: Hello
与原来的:
Traceback (most recent call last):
File "/home/stack_overflow/main.py", line 13, in <module>
raise MyCustomException("bad stuff happened")
so75195149.deeply_nested.MyCustomException: Hello
有关详细信息,请参阅traceback.format_exception
和限定名称 ( __qualname__
) 。
但我建议您在设置自定义 excepthook 时要小心。 如果另一个异常使程序崩溃,您将得不到它的限定名称,这通常很有用(默认包含它的原因)。 它对整个 Pyhton 应用程序是全局的。
相反,我建议将您的自定义异常包装在非深度需求定义的异常中。 或者不使用自定义异常,使用标准异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.