Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取Python捕获的异常的名称?_Python_Exception - Fatal编程技术网

如何获取Python捕获的异常的名称?

如何获取Python捕获的异常的名称?,python,exception,Python,Exception,如何获取Python中引发的异常的名称 e、 g 例如,我正在捕获多个(或所有)异常,并希望在错误消息中打印该异常的名称。这是可行的,但似乎必须有一种更简单、更直接的方法 try: foo = bar except Exception as exception: assert repr(exception) == '''NameError("name 'bar' is not defined",)''' name = repr(exception).split('(')[

如何获取Python中引发的异常的名称

e、 g


例如,我正在捕获多个(或所有)异常,并希望在错误消息中打印该异常的名称。

这是可行的,但似乎必须有一种更简单、更直接的方法

try:
    foo = bar
except Exception as exception:
    assert repr(exception) == '''NameError("name 'bar' is not defined",)'''
    name = repr(exception).split('(')[0]
    assert name == 'NameError'

以下是获取异常类名称的几种不同方法:

  • 类型(例外)。\uuuuu名称\uuuuuu
  • exception.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
  • exception.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
  • e、 g


    您还可以使用
    sys.exc\u info()
    exc_info()
    返回3个值:类型、值、回溯。关于文件:


    如果您想要完全限定类名(例如,
    sqlalchemy.exc.IntegrityError
    ,而不仅仅是
    IntegrityError
    ),您可以使用下面的函数,这是我从到另一个问题(我刚刚重命名了一些变量以适应我的口味):

    例如:

    try:
        # <do something with sqlalchemy that angers the database>
    except sqlalchemy.exc.SQLAlchemyError as e:
        print(get_full_class_name(e))
    
    # sqlalchemy.exc.IntegrityError
    
    试试看:
    # 
    除了sqlalchemy.exc.SQLAlchemyError作为e:
    打印(获取完整类名称(e))
    #sqlalchemy.exc.IntegrityError
    

    这里的其他答案对于探索来说是很好的,但是如果主要目的是记录异常(包括异常的名称),也许考虑使用替代而不是打印?< /P>替换“代码>”,除了异常(异常除外)/代码>,您希望捕获的异常类型,也就是说,

    除了NameError作为异常之外
    。我不想捕捉预先知道的特定异常。我想抓住所有的例外。你为什么认为你需要这个?为什么不先捕获一个更具体的异常(例如,
    除了NameError:
    )呢?我有几个场景,希望捕获所有异常(或它们的列表),并希望在错误消息中打印出异常的名称。您可能希望签出标准库的模块,它有一些函数可以很好地格式化异常和回溯。@delnan当您测试某个函数是否在programmedI中引发异常时,就会出现这种情况。我需要这样的东西来干涸一些代码:我调用的方法可以引发几个异常,除了
    语句外,每个都使用自己的
    语句进行处理,但在每种情况下,日志条目都非常相似。当您启动
    raise socket.timeout
    时,您只会得到名称:
    timeout
    是否有方法获取
    回溯(最近的调用最后一次):…
    ?您是否回答了这个问题?
    try:
        foo = bar
    except Exception as exception:
        assert type(exception).__name__ == 'NameError'
        assert exception.__class__.__name__ == 'NameError'
        assert exception.__class__.__qualname__ == 'NameError'
    
    import sys
    
    try:
        foo = bar
    except Exception:
        exc_type, value, traceback = sys.exc_info()
        assert exc_type.__name__ == 'NameError'
        print "Failed with exception [%s]" % exc_type.__name__
    
    def get_full_class_name(obj):
        module = obj.__class__.__module__
        if module is None or module == str.__class__.__module__:
            return obj.__class__.__name__
        return module + '.' + obj.__class__.__name__
    
    try:
        # <do something with sqlalchemy that angers the database>
    except sqlalchemy.exc.SQLAlchemyError as e:
        print(get_full_class_name(e))
    
    # sqlalchemy.exc.IntegrityError