16

我想知道在 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 子句中调用的软关闭。但这似乎没有必要。

4

4 回答 4

20

怎么样写 2 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
于 2011-06-09T21:56:00.917 回答
18

仅调用块中的单个except子句。try如果您希望异常被捕获到更高的位置,那么您将需要使用嵌套try块。

于 2011-06-09T21:54:09.677 回答
1

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

无论如何,为什么你真的需要第二个?你能提供更多细节吗?

于 2011-06-09T21:59:29.260 回答
0

您可以使用该six软件包执行此操作。

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

具体见six.reraise

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

于 2018-07-03T19:58:39.220 回答