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

Python 是否可以捕获多种类型的异常,然后打印发生的确切类型?,python,exception,python-2.7,exception-handling,Python,Exception,Python 2.7,Exception Handling,这是我在捕获多个异常(正确的方法)时所能找到的,在奇迹般的默许之后,解释器允许以下代码片段: try: x = "5" + 3 except NameError and TypeError as e: print e 也将提供此代码段,但与前者不同: ... except (RuntimeError, TypeError, NameError): ... pass 所以,有第二种意见是很好的,但我的问题实际上归结为: 如何不仅打印消息,而且在print语句的开头插入

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

try:
    x = "5" + 3
except NameError and TypeError as e:
    print e
也将提供此代码段,但与前者不同:

... except (RuntimeError, TypeError, NameError):
...     pass
所以,有第二种意见是很好的,但我的问题实际上归结为:

  • 如何不仅打印消息,而且在print语句的开头插入引发的错误的确切类型。例如,我希望第一个代码段通过打印来响应:
    TypeError:无法连接'str'和'int'对象
我觉得这可能不可能,也不容易,因为解释器只列出
args
message
作为
namererror
的成员,但这可能是不完整的

我自己也尝试过,但不再排除错误(我可能会误解isinstance):


您的问题是,您正试图在一个字符串中包含这样一个异常

>>> 'foo' + TypeError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'type' objects
>“foo”+类型错误
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:无法连接“str”和“type”对象
最简单的解决方法:

>>> 'foo' + str(TypeError)
"foo<type 'exceptions.TypeError'>"
>>> 
>'foo'+str(TypeError)
“福”
>>> 

您可以单独捕获错误。有关更多示例,请参见此链接:

如下所示:

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

既然minitech已经向您展示了做您想做的事情的最佳方法(
打印类型(e)。\uuuu name\uuuuuuuu
),我就介绍一下您做错了什么

如果
e=namererror(“坏,坏,坏!”)
,则
print e
给出
坏,坏,坏


但是,
“我的字符串”+e
无效,因为
e
不是字符串。使用
打印“我的字符串”、e
打印“我的字符串”+str(e)
打印“我的字符串”{}。格式(e)

其他人已经很好地回答了你的第二个问题,因此我将回答你的第一个问题:

except NameError and TypeError as e:
与以下内容完全相同:

except TypeError as e:
它不会捕获
namererror
。为什么?因为
namererror
是真实的,所以
计算并返回其第二个参数
TypeError
。尝试:

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

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

except (TypeError, ValueError) as e:

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

键入(e)。\uuuu name\uuuu
?这可能不是最好的方法,虽然。@minitech这是天才,但我仍然不知道为什么我的最后一个片段失败了。我似乎误解了我正在做的事情。它失败了,因为你不能很容易地找到一个异常字符串。另一方面,
print“NameError:,e
?谢谢你的解释,因为
print e
是可以接受的,我认为它是一个字符串!就我而言,这不是一件明智的事情。为什么一个异常会突然变成一个字符串?奇怪的想法!“在Python 1.5之前,标准异常是作为字符串实现的。”(!)来源:核心Python编程,第二版;韦斯利·J·春;普伦蒂斯大厅,2007年;第10.5章:*例外情况为字符串。添加感叹号。;)
except (TypeError, ValueError) as e: