import sys
try:
raise "xxx"
except str,e:
print "1",e
except:
print "2",sys.exc_type,sys.exc_value
在上面的代码中引发了一个字符串异常虽然已弃用,但我使用的第三方库仍然使用它。 那么如何在不依赖于捕获全部的情况下捕获此类异常,这可能是不好的。
除了str,e:没有抓住它?为什么呢?
系统: Python 2.5.2(r252:60911,2008年7月31日,17:28:52) [linux2上的[GCC 4.2.3(Ubuntu 4.2.3-2ubuntu7)]
答案 0 :(得分:6)
通用except:
子句是捕获所有str异常的唯一方法。
str exception是遗留的Python功能。在新代码中,您应该使用raise Exception("xxx")
或者引用您自己的Exception子类,或assert 0, "xxx"
。
答案 1 :(得分:4)
以下是来自python mailing list的解决方案,不是很优雅,但如果不能避免需要这样的黑客就会起作用
import sys
try:
raise "a string exception"
except:
e, t, tb = sys.exc_info()
if not isinstance(e, str):
raise
print "caught", e
答案 2 :(得分:2)
try:
raise "xxx"
except "xxx":
print "xxx caught"
except <class>
仅适用于我认为是Exception
的子类的类。哦顺便说一句,在检查字符串类型时使用basestring
,也可以使用unicode字符串。
答案 3 :(得分:2)
提高原始字符串是错误的。这是一个不推荐使用的功能(因此应该引发警告)。如果您真的需要它,捕获显式字符串将起作用,因此将捕获所有内容。由于捕获所有内容都会在您的代码中出现问题,因此我建议明确地捕获字符串,甚至更好:修复损坏的库。
try:
#code_that_throws_string()
raise("spam")
except "spam":
pass
将到达传递声明。有许多充分的理由不使用字符串作为例外,这是其中之一(另一个是:我不相信你可以得到回溯,因此它们对于修复错误很无用)。
所以,修好图书馆(好)。或者明确地捕获字符串(坏)。或者抓住一切(非常糟糕)并做一些isinstance(e,str)检查(甚至更糟)。