是否可以捕获多种类型的异常,然后打印出现的确切类型?

Leo*_*rdo 4 python exception-handling exception python-2.7

这是最接近的答案我能找到的捕获多个异常(正确的方法),当默认的奇迹解释允许下面的代码片段:

try:
    x = "5" + 3
except NameError and TypeError as e:
    print e
Run Code Online (Sandbox Code Playgroud)

文档将提供该片段为好,但没有像前者:

... except (RuntimeError, TypeError, NameError):
...     pass
Run Code Online (Sandbox Code Playgroud)

因此,有一个第二意见是很好的,但我的问题实际上归结为:

  • 我怎样才能不仅打印消息,而且在print语句的开头插入确切的错误类型.例如,我更喜欢第一个片段通过打印来响应:TypeError: cannot concatenate 'str' and 'int' objects

我觉得这可能是不可能或不容易的,因为解释器只列出args并且message作为成员,NameError但也许只是不完整.

我自己尝试了这个,但它不再排除错误(我可能会误解isinstance):

try:
    x = "5" + 3
except (NameError, TypeError) as e:
    if isinstance(e, NameError):
        print "NameError: " + e
    elif isinstance(e, TypeError):
        print "TypeError: " + e
    else:
        print e
Run Code Online (Sandbox Code Playgroud)

JRP*_*JRP 9

您可以单独捕获错误.有关更多示例,请参阅此链接:http: //docs.python.org/2/tutorial/errors.html#handling-exceptions

类似于以下内容:

try:
    x = "5" + 3
except TypeError as e:
    print "This is a TypeError"
    print e
except NameError as e:
    print "This is a NameError"
    print e
Run Code Online (Sandbox Code Playgroud)


kin*_*all 8

其他人已经很好地回答了你的第二个问题,所以我将解决你的第一个问题:

except NameError and TypeError as e:
Run Code Online (Sandbox Code Playgroud)

与以下内容完全相同:

except TypeError as e:
Run Code Online (Sandbox Code Playgroud)

它不会抓住NameError.为什么?因为NameError是真实的,所以and评估并返回它的第二个参数,TypeError.尝试:

print NameError and TypeError
Run Code Online (Sandbox Code Playgroud)

是的,except子句中的异常在运行时像任何其他表达式一样进行计算.实际上,Python甚至不要求它们是异常(但是,如果它们不是,它们将永远不会捕获任何东西,因为它们raise需要例外......好吧,你可以使用字符串,但它们已被弃用).

因此,您必须提供要捕获的异常元组:

except (TypeError, ValueError) as e:
Run Code Online (Sandbox Code Playgroud)

Python可以接受其他形式作为有效语法,但可能不会像您期望的那样工作.


小智 1

你的问题是你试图连接一个带有这样的异常的字符串

>>> 'foo' + TypeError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'type' objects
Run Code Online (Sandbox Code Playgroud)

最简单的解决方法:

>>> 'foo' + str(TypeError)
"foo<type 'exceptions.TypeError'>"
>>> 
Run Code Online (Sandbox Code Playgroud)