繁体   English   中英

python 显示引发异常的类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM