4

这是我在捕获多个异常(正确方法)时能找到的最接近的答案,在默许奇迹之后,解释器允许以下片段:

try:
    x = "5" + 3
except NameError and TypeError as e:
    print e

文档也将提供此代码段,但与前者不同:

... except (RuntimeError, TypeError, NameError):
...     pass

所以最好有第二个意见,但我的问题真的归结为:

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

我觉得这可能是不可能的,或者容易的,因为解释器只列出argsmessage作为成员,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
4

4 回答 4

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
于 2013-09-26T03:53:54.393 回答
8

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

except NameError and TypeError as e:

与以下内容完全相同:

except TypeError as e:

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

print NameError and TypeError

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

出于这个原因,您必须提供要捕获的异常的元组:

except (TypeError, ValueError) as e:

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

于 2013-09-26T04:06:11.540 回答
2

由于 minitech 已经向您展示了做您想做的事情的最佳方法 ( print type(e).__name__),我将只介绍您做错了什么。

如果e = NameError("BAD, BAD, BAD!"),则print e给出BAD, BAD, BAD!

但是,"My string" + e无效,因为e它不是字符串。使用print "My string", e,print "My string" + str(e)print "My string{}".format(e)代替。

于 2013-09-26T03:55:18.970 回答
1

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

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

最简单的解决方法:

>>> 'foo' + str(TypeError)
"foo<type 'exceptions.TypeError'>"
>>> 
于 2013-09-26T03:53:52.770 回答