重新引发异常的目的是什么?

5

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

try:
    whatever()
except:
    raise

重新抛出异常有什么用呢?难道未捕获的异常不会一直向上抛出吗?例如:
try:
    int("bad")
except:
    raise

具有相同的输出:

int("bad")

即,我在控制台中收到了ValueError错误。


1
当你做其他事情时,它非常有用 - 例如打印额外的调试信息或清理文件。 - muddyfish
3
通常情况下,你不仅需要重新抛出异常。 - Martijn Pieters
2个回答

4

您的示例代码没有意义,但如果您想执行仅在失败时发生的日志记录或清理操作,可以将其放置在except:raise之间,然后进行该工作,然后继续像原始异常正常冒泡一样进行。


好的,如果我愿意接受由较低函数引发的任何异常,并让应用程序中更高层次的东西来处理它们,那么我就可以不必使用try/except了吗? - David Board
1
@DavidBoard:是的。这是异常与返回错误代码相比的主要优势;那些不理解并且无法处理特定异常的函数根本不需要编写处理它的代码,只需顺畅地上升直到找到能够处理它的人为止。 - ShadowRanger
except: raise(没有其他代码)是毫无意义的。但我确实经常遇到它,它会掩盖真正的故障点。似乎这是 Python 异常哲学的一种影响。 - semiomant
@semiomant:如果实际上是一个裸的raise,它不会掩盖真正的失败点(原始异常,包括回溯,将继续向上冒泡,就像从未被拦截一样)。但是,在Python 2上,如果他们引发了一个不同的异常而没有明确采取措施保留有关原始异常的信息,则原始原因将丢失(Python 3在exceptfinally块中引发新异常时链接异常上下文,因此信息并非完全丢失)。 - ShadowRanger

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

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