【问题标题】:How to catch message of finally exception clause in python?如何在python中捕获finally异常子句的消息?
【发布时间】:2011-06-21 22:40:23
【问题描述】:

我知道如何捕获异常并打印它们返回的消息:

class SelfDefinedException(Exception): pass

try:
    message = "Hello World!"
    raise SelfDefinedException(message)
except MyDefinedException, e:
    print "MyDefinedException", e

到目前为止效果很好。

但我如何才能在“finally”子句中捕获并打印消息?

class SelfDefinedException(Exception): pass

try:
    message = "Hello World!"
    raise SelfDefinedException(message)
except MyDefinedException, e:
    print "MyDefinedException", e
finally:
    # What goes here? So I can see what went wrong?

从我了解的几个答案中,这是不可能的。这样做可以吗?

class SelfDefinedException(Exception): pass

try:
    message = "Hello World!"
    raise SelfDefinedException(message)
except MyDefinedException, e:
    print "MyDefinedException", e
except Exception, e:
    # Hopefully catches all messages except for the one of MyDefinedException
    print "Unexpected Exception raised:", e

【问题讨论】:

  • 为什么要这样做?除了条款还不够好吗?
  • @Winston,我实现了对自己引发的异常的处理,但我想知道是否以某种方式引发了另一个我没想到的异常。查看我的编辑。
  • 是的,如果您想捕获所有其他异常,只需使用更多的 except 子句继续列出它们。 see documentation

标签: python exception-handling try-catch-finally


【解决方案1】:

finally 块中的代码将始终被评估。检查 catch 块中出了什么问题

【讨论】:

  • 我明白,finally 在我的示例中捕获除SelfDefinedException 之外的任何异常。但是如何在 finally` 块中可视化消息以及在 try 块中引发的异常类型?
  • @Druss,finally 子句没有捕获任何异常。它总是即使在成功的情况下也会执行
【解决方案2】:

根据documentation,你不能:

异常信息不是 期间可用于程序 finally 子句的执行。

最好签入 except 块。

【讨论】:

    【解决方案3】:

    捕捉任何东西都可以使用:

    try:
        foo()
    except:
        print sys.exc_info()
        raise
    

    但这几乎总是错误的做法。如果你不知道发生了什么样的异常,那么你就无能为力了。如果发生这种情况,您的程序应该关闭并提供尽可能多的信息。

    【讨论】:

      【解决方案4】:

      我需要类似的东西,但在我的情况下,总是在没有发生异常时清理一些资源。 下面的解决方案示例对我有用,也应该回答这个问题。

          caught_exception=None
          try:
            x = 10/0
            #return my_function()
          except Exception as e:
            caught_exception = e
          finally:
            if caught_exception:
               #Do stuff when exception
               raise # re-raise exception
            print "No exception"
      

      【讨论】:

      • 你最好把#Do stuff when exception移到except,把print "No exception"移到else
      • @GingerPlusPlus 我明白你的意思,但构造回答了“但是我如何才能在 'finally' 子句中捕获并打印消息?”
      猜你喜欢
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 2020-09-02
      • 2013-02-12
      • 2019-12-23
      • 2015-06-12
      相关资源
      最近更新 更多