代码之家  ›  专栏  ›  技术社区  ›  Craig McQueen Dr. Watson

处理except子句中发生的python异常

  •  16
  • Craig McQueen Dr. Watson  · 技术社区  · 15 年前

    我有一些python代码 except 子句,该子句旨在执行某些日志记录,但日志记录代码本身可能会导致异常。在我的例子中,我只想忽略可能发生的任何第二个异常,并引发原始异常。下面是一个非常简单的示例:

    try:
        a = this_variable_doesnt_exist
    except:
        try:
            1/0
        except:
            pass
        raise
    

    运行上面的代码,我希望得到:

    NameError: name 'this_variable_doesnt_exist' is not defined
    

    但是,在python 2.x中,我得到:

    ZeroDivisionError: integer division or modulo by zero
    

    我发现在Python3.x中,它可以做我想做的事情。

    我在Python2.x文档中找不到关于这个的评论(除非我错过了)。我能在2.x内完成吗?

    3 回复  |  直到 11 年前
        1
  •  16
  •   Chris Lutz    15 年前

    抽象地说:

    def log_it():
        try:
            1 / 0
        except:
            pass
    
    try:
        this = that
    except:
        log_it()
        raise
    

    在Python2.5中做您想要的事情

    另一种方法是将异常存储在变量中,然后显式重新引发它:

    try:
        this = that
    except NameError, e: # or NameError as e for Python 2.6
        try:
            1 / 0
        except:
            pass
        raise e
    

    请注意,您可能不应该只是使用裸 except 要捕获可能出现的所有异常,通常最好捕获在发生严重且致命的异常(如内存不足)时预期发生的特定异常。

        2
  •  21
  •   Alok Singhal    15 年前

    我相信你看到的是 exception chaining ,这是一个 change in Python 3 .

    动机 政治公众人物部分:

    在处理一个异常期间(异常 A ,可能是另一个异常(异常 B )可能发生。在今天的python(2.4版)中,如果发生这种情况,则异常 向外传播和异常 是迷路了。为了调试问题,了解这两个异常是很有用的。这个 __context__ 属性自动保留此信息。

    pep接着详细描述了新的异常链(在py3k中实现),这是一篇有趣的文章。我今天学到了新的东西。

        3
  •  0
  •   Duncan Jones    11 年前

    在我的 CausedException class 对于Python2.x(以及Python3,如果您希望传递原因树而不是简单的原因链),我会处理这个问题。也许它能帮助你。