Python重新引发/捕获异常

21

我想知道在Python中是否可以在一个`except`块中引发异常,并在后面的`except`块中捕获它。我相信一些其他语言默认情况下就是这样做的。

这是示例:

try:
   something
except SpecificError as ex:
   if str(ex) = "some error I am expecting"
      print "close softly"
   else:
      raise
except Exception as ex:
   print "did not close softly"
   raise

我希望 else 子句中的 raise 会触发最终的异常语句。

实际上,我没有打印任何东西,而是将其记录下来。如果它是我不希望出现的错误消息,我希望记录更多信息。然而,这个额外的日志记录将包含在最终的异常处理中。

我认为一个解决方案是创建一个函数,在最终的异常处理和 else 子句中都调用它,但这似乎是不必要的。

4个回答

22

那么写两个try...except块怎么样:

try:
    try:
       something
    except SpecificError as ex:
       if str(ex) == "some error I am expecting"
          print "close softly"
       else:
          raise ex
except Exception as ex:
   print "did not close softly"
   raise ex

5
对于Python 2.6及以上版本,应该使用except SpecificError as ex:。请参考此链接获取有关逗号和as用法的更多信息:https://dev59.com/WHE85IYBdhLWcg3w8IXK。 - hum3

20

try块中,只有一个except子句被调用。如果你想要更高层次的代码捕获该异常,那么你需要使用嵌套的try块。


1
根据Python tutorial,每个try语句只能捕获一个异常。在教程中可以找到非常简单的示例,还会向您展示如何正确使用错误格式。
无论如何,为什么您真正需要第二个呢?您能提供更多细节吗?

0

您可以使用six包来实现此操作。

Six提供了简单的实用程序,用于处理Python 2和Python 3之间的差异。

具体而言,请参见six.reraise

重新引发异常,可能带有不同的回溯信息。在简单情况下,使用活动异常(在except块中)的最后一个回溯信息,即reraise(*sys.exc_info()),将重新引发当前异常。可以使用exc_traceback参数指定不同的回溯信息。请注意,由于异常重新引发是在reraise()函数内完成的,因此Python将把reraise()的调用帧附加到引发的任何回溯信息上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接