【问题标题】:What is the point of re-raising exceptions?重新提出异常有什么意义?
【发布时间】:2016-08-25 11:19:36
【问题描述】:

所以我在其他地方看到过使用以下内容重新引发异常。

try:
    whatever()
except:
    raise

重新引发异常的目的是什么?无论如何,一个未被捕获的异常肯定会上升到顶部吗?即:

try:
    int("bad")
except:
    raise

与以下输出相同:

int("bad")

即我在控制台中收到一个 ValueError。

【问题讨论】:

  • 它在你做其他事情时很有用 - 例如打印出额外的调试信息或清理文件
  • 通常您不会重新引发异常。

标签: python exception


【解决方案1】:

您的示例代码毫无意义,但如果您想执行仅在失败时发生的日志记录或清理,您可以将其放在 except:raise 之间,然后您将完成这项工作,然后像原来的异常正常冒泡。

【讨论】:

  • 好的,所以如果我很乐意接受低级函数引发的任何异常,并让应用程序中更高层的东西处理它们,我就可以不用 try/except 了吗?
  • @DavidBoard:是的。与返回错误代码相比,异常的主要优势;对给定异常不理解且无能为力的函数根本不需要编写代码来处理它,它只是无缝地冒泡,直到找到可以处理它的人。
  • 这是真正的答案。 except: raise(没有其他代码)毫无意义。但我确实遇到了很多,掩盖了真正的失败点。似乎是python异常禅的影响。
  • @semiomant:如果它实际上是一个裸露的raise,它不会掩盖真正的故障点(最初的异常,包括回溯,将继续冒泡,就好像它从未被截获一样) .但是是的,在 Python 2 上,如果它们引发不同的异常而没有明确地做一些事情来保留有关原始异常的信息,那么原始原因就会丢失(当在 except 或 @987654326 中引发新异常时,Python 3 会链接异常上下文@block,所以信息不会完全丢失)。
【解决方案2】:

想象一下下面的代码。

一个小设置:例如,您负责维护一个庞大的信息数据库,任何数据丢失都将是灾难性的!

huge_dictionary = {'lots_of_important':['stuffs']}
try:
    check_data(new_data) #make sure the data is in the correct format
    huge_dictionary['lots_of_important'].append(new_data)
except:
    data_writer.backup(huge_dictionary)
    data_writer.close()
    #and any other last second changes
    raise

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2016-07-14
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多