Python 重新提出例外情况有什么意义?

Python 重新提出例外情况有什么意义?,python,exception,Python,Exception,因此,我在其他地方看到有人提到使用以下内容重新引发异常 try: whatever() except: raise 重新提出例外的目的是什么?毫无疑问,一个意外的例外会上升到最高点吗?i、 e: try: int("bad") except: raise 具有与以下相同的输出: int("bad") i、 e.我在控制台中得到一个ValueError。您的示例代码是毫无意义的,但是如果您想执行仅在失败时发生的日志记录或清理,您可以将其放在异常:和提升之间,然

因此,我在其他地方看到有人提到使用以下内容重新引发异常

try:
    whatever()
except:
    raise
重新提出例外的目的是什么?毫无疑问,一个意外的例外会上升到最高点吗?i、 e:

try:
    int("bad")
except:
    raise
具有与以下相同的输出:

int("bad")

i、 e.我在控制台中得到一个ValueError。

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

想象以下代码

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

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

当您执行其他操作时,它非常有用—例如打印额外的调试信息或清理文件—通常您不仅会重新引发异常。好的,因此,如果我乐意接受低级函数引发的任何异常,并让应用程序中的高级函数处理它们,那么我就不必麻烦使用try/except了?@DavidBoard:yes。异常相对于返回错误代码的主要优势;对于给定的异常,那些不理解也不能做任何事情的函数根本不需要编写代码来处理它,它只是无缝地冒出气泡,直到找到能够处理它的人。这才是真正的答案<代码>除了:raise(没有其他代码)是没有意义的。但我确实遇到过不少这样的情况,掩盖了真正的失败点。似乎是python异常zen的一种效果。@semiomant:如果它实际上是一个裸的
提升
,它不会掩盖真正的失败点(原始异常,包括回溯,将恢复冒泡,好像从未被拦截过一样)。但是是的,在Python 2上,如果它们在没有明确做一些事情来保留原始异常的信息的情况下引发了不同的异常,那么原始原因就会丢失(Python 3在
中引发新异常时会链接异常上下文,除了
finally
块,因此信息不会完全丢失)。