繁体   English   中英

打印Python异常/错误层次结构

[英]Print the Python Exception/Error Hierarchy

python中的any命令行选项可以打印异常/错误类层次结构吗?

输出应类似于http://docs.python.org/2/library/exceptions.html#exception-hierarchy

检查模块可能会有所帮助,特别是getclasstree()函数:

将给定的类列表排列为嵌套列表的层次结构。 在出现嵌套列表的地方,它包含派生自该类的类,其条目紧接在列表之前。

inspect.getclasstree(inspect.getmro(Exception))

或者,您可以通过继承树递归遍历__subclasses__() ,如下所示:

def classtree(cls, indent=0):
    print '.' * indent, cls.__name__
    for subcls in cls.__subclasses__():
        classtree(subcls, indent + 3)

classtree(BaseException)

印刷品:

 BaseException
... Exception
...... StandardError
......... TypeError
......... ImportError
............ ZipImportError
......... EnvironmentError
............ IOError
............... ItimerError
............ OSError
......... EOFError
......... RuntimeError
............ NotImplementedError
......... NameError
............ UnboundLocalError
......... AttributeError
......... SyntaxError
............ IndentationError
............... TabError
......... LookupError
............ IndexError
............ KeyError
............ CodecRegistryError
......... ValueError
............ UnicodeError
............... UnicodeEncodeError
............... UnicodeDecodeError
............... UnicodeTranslateError
......... AssertionError
......... ArithmeticError
............ FloatingPointError
............ OverflowError
............ ZeroDivisionError
......... SystemError
............ CodecRegistryError
......... ReferenceError
......... MemoryError
......... BufferError
...... StopIteration
...... Warning
......... UserWarning
......... DeprecationWarning
......... PendingDeprecationWarning
......... SyntaxWarning
......... RuntimeWarning
......... FutureWarning
......... ImportWarning
......... UnicodeWarning
......... BytesWarning
...... _OptionError
... GeneratorExit
... SystemExit
... KeyboardInterrupt

重用标准库中的代码,而不用自己滚动。

import inspect
import pydoc

def print_class_hierarchy(classes=()):
    td = pydoc.TextDoc()
    tree_list_of_lists = inspect.getclasstree(classes)
    print(td.formattree(tree_list_of_lists, 'NameSpaceName'))

要使用此功能,我们需要列表形式的类层次结构,这对于我们传递函数很有意义。 我们可以使用此函数通过递归搜索类.__subclasses__()方法的结果来构建它( 我将在此处保留其规范版本 ):

def get_subclasses(cls):
    """returns all subclasses of argument, cls"""
    if issubclass(cls, type): # not a bound method
        subclasses = cls.__subclasses__(cls)
    else:
        subclasses = cls.__subclasses__()
    for subclass in subclasses:
        subclasses.extend(get_subclasses(subclass))
    return subclasses

放在一起:

list_of_classes = get_subclasses(int)
print_class_hierarchy(list_of_classes)

哪些打印(在Python 3中):

>>> print_class_hierarchy(classes)
builtins.int(builtins.object)
    builtins.bool
    enum.IntEnum(builtins.int, enum.Enum)
        inspect._ParameterKind
        signal.Handlers
        signal.Signals
    enum.IntFlag(builtins.int, enum.Flag)
        re.RegexFlag
    sre_constants._NamedIntConstant
    subprocess.Handle
enum.Enum(builtins.object)
    enum.IntEnum(builtins.int, enum.Enum)
        inspect._ParameterKind
        signal.Handlers
        signal.Signals
enum.Flag(enum.Enum)
    enum.IntFlag(builtins.int, enum.Flag)
        re.RegexFlag

这为我们提供了所有子类的树,以及相关的多个继承类-并告诉我们它们所生活的模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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