如何捕获str异常?

时间:2009-05-15 08:11:01

标签: python exception string

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)]

4 个答案:

答案 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)检查(甚至更糟)。