【问题标题】:Python reraise/recatch exceptionPython重新引发/重新捕获异常
【发布时间】:2011-09-12 02:06:03
【问题描述】:

我想知道在 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 触发最后的 except 语句。

实际上,除了记录它之外,我没有打印任何内容,并且我想记录更多信息,以防出现我不期望的错误消息。但是,这个额外的日志记录将包含在最终的例外中。

我相信一个解决方案是创建一个函数,如果它没有软关闭,它会在最后的 except 和 else 子句中调用。但这似乎没有必要。

【问题讨论】:

    标签: python exception raise


    【解决方案1】:

    您可以使用six 包来做到这一点。

    Six 提供了简单的实用程序来解决 Python 2 和 Python 3 之间的差异。

    具体见six.reraise:

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

    【讨论】:

      【解决方案2】:

      写2个试试怎么样...除了这样的块:

      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
      

      【讨论】:

      【解决方案3】:

      根据 python tutorial,每个 try 语句只有一个捕获的异常。 您可以在教程中找到非常简单的示例,该示例还将向您展示如何正确使用错误格式。

      无论如何,你为什么真的需要第二个?您能否提供更多详细信息?

      【讨论】:

        【解决方案4】:

        仅调用 try 块中的单个 except 子句。如果您希望更高层捕获异常,则需要使用嵌套的 try 块。

        【讨论】:

          猜你喜欢
          • 2018-12-14
          • 2014-07-09
          • 2021-10-04
          • 2023-03-31
          • 2017-07-24
          • 1970-01-01
          • 1970-01-01
          • 2011-06-27
          • 2012-01-13
          相关资源
          最近更新 更多