【问题标题】:What does raise in Python raise?Python 中的 raise 会提高什么?
【发布时间】:2010-10-14 17:00:03
【问题描述】:

考虑以下代码:

try:
    raise Exception("a")
except:
    try:
        raise Exception("b")
    finally:
        raise

这将引发Exception: a。我预计它会提高Exception: b(需要我解释为什么吗?)。为什么最终的raise 引发了原始异常,而不是(我认为)是最后一个引发的异常?

【问题讨论】:

  • Python 3.1 提高了两者。
  • 啊。我应该提到我使用的是 Python 2.6。
  • 只是出于好奇:同一组合上的 C# 编译器说“错误:嵌套在最近的封闭 catch 子句中的 finally 子句中不允许使用没有参数的 throw 语句”(throw == raise , 捕捉 == 除外)。没有歧义!
  • @Andrey 但是,我不希望代码会造成歧义。我预计第二个例外会影响第一个例外。我以前认为raise 是指最后抛出的异常。我才知道我错了。
  • @Andrey 你的问题是什么?

标签: python exception


【解决方案1】:

Raise 是重新引发您捕获的最后一个异常,而不是您引发的最后一个异常

(为清楚起见,转自 cmets)

【讨论】:

    【解决方案2】:

    在python2.6上

    我猜,您希望 finally 块与引发异常“B”的“try”块相关联。 finally 块附加到第一个“try”块。

    如果你在内部 try 块中添加了一个 except 块,那么 finally 块将引发异常 B。

    try:
      raise Exception("a")
    except:
      try:
        raise Exception("b")
      except:
        pass
      finally:
        raise
    

    输出:

    Traceback (most recent call last):
      File "test.py", line 5, in <module>
        raise Exception("b")
    Exception: b
    

    另一个解释这里发生了什么的变体

    try:
      raise Exception("a")
    except:
      try:
        raise Exception("b")
      except:
        raise
    

    输出:

    Traceback (most recent call last):
      File "test.py", line 7, in <module>
        raise Exception("b")
    Exception: b
    

    如果您在此处看到,将 finally 块替换为 except 确实会引发异常 B。

    【讨论】:

    • 我也得出了同样的结论。
    • 确实,这行得通!我从来没有猜到。这是在某处记录的吗?这是一个特性还是语法问题的必要性?
    • 为什么第二个异常不只是影响第一个?我希望 Python 会在语法上出错,或者至少警告我这一点。
    • wilhelmtell:raise 正在重新引发您捕获的最后一个异常,而不是您引发的最后一个异常。如果您在抛出异常后自行尝试 raise 并且您之前没有捕获任何异常,您将收到 TypeError,因为没有什么可以重新引发。
    • 您的句子The finally block is attached to the first "try" block. 非常具有误导性,从句法的角度来看是完全错误的。更好地专注于 raise 所绑定的内容。我认为这应该更好地改写(也许也是之前的句子)。
    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2011-06-15
    • 2012-10-03
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多