【问题标题】:How to catch str exception?如何捕获 str 异常?
【发布时间】:2009-05-15 08:11:01
【问题描述】:
import sys
try:
    raise "xxx"
except str,e:
    print "1",e
except:
    print "2",sys.exc_type,sys.exc_value

在上面的代码中,引发了一个字符串异常,尽管它已被弃用,但我使用的第 3 方库仍然使用它。 那么如何在不依赖全部捕获的情况下捕获此类异常,这可能很糟糕。

除了 str,e: 没有抓住它?为什么?

系统: Python 2.5.2(r252:60911,2008 年 7 月 31 日,17:28:52) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] 在 linux2 上

【问题讨论】:

    标签: python exception string


    【解决方案1】:

    通用 except: 子句是捕获所有 str 异常的唯一方法。

    str 异常是一个遗留的 Python 特性。在新代码中,您应该使用raise Exception("xxx") 或引发您自己的异常子类,或assert 0, "xxx"

    【讨论】:

    • 但是你能对第三方库做些什么呢?
    • 寻找更好的第三方库。或者。修理它。你有来源。您可以更改来源。修好就好了。
    • @S.Lott 在 3 年后回复,我为什么要浪费一天或更长时间来修复和测试第三方库,然后再测试它,当我可以在不到一个小时内解决问题时至少对于小型测试项目,我认为这样做没有问题
    【解决方案2】:

    这是来自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
    

    【讨论】:

      【解决方案3】:
      try:
          raise "xxx"
      
      except "xxx":
          print "xxx caught"
      

      except <class> 我认为只适用于Exception 的子类。哦,顺便说一句,检查字符串类型时使用basestring,也适用于 unicode 字符串。

      【讨论】:

      • 我无法捕捉到“xxx”,因为我不知道真实代码中来自 3rd 方库的异常会是什么
      【解决方案4】:

      提高原始字符串是错误的。这是一个已弃用的功能(因此应该提出警告)。如果你真的需要它,捕获显式字符串将起作用,捕获所有内容也是如此。由于捕获所有内容会使您的代码变得丑陋,因此我建议明确捕获字符串,甚至更好:修复损坏的库。

      try:
          #code_that_throws_string()
          raise("spam")
      except "spam":
          pass
      

      将到达 pass 语句。有很多充分的理由不将字符串用作异常,这就是其中之一(另一个是:我不相信您可以获得回溯,因此它们对于错误修复基本上没有用处)。

      所以,修复库(好)。或者明确地抓住字符串(坏的)。或者捕获所有内容(非常糟糕)并进行一些 isinstance(e, str) 检查(甚至更糟)。

      【讨论】:

        猜你喜欢
        • 2017-03-14
        • 2016-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多