引发异常并处理它。只是为了再次提起它;python

引发异常并处理它。只是为了再次提起它;python,python,Python,我正在阅读Python教程 我看到一个部分说: " 如果需要确定是否引发了异常但不打算处理它,则raise语句的更简单形式允许您重新引发异常: " 我不明白为什么一个人会引发一个异常,处理它,然后重新引发它 如果程序员不想处理异常,他们不应该首先使用try..except语句???如果您不将异常视为必须捕获/纠正的错误,而是将其视为信息交流的一种方式,这会有所帮助 有时,当您捕获到异常时,这是意料之中的,或者您可以找到解决它的方法。其他时候,异常意味着你不能做你想做的事情,所以你想向你自己的调用

我正在阅读Python教程

我看到一个部分说:

" 如果需要确定是否引发了异常但不打算处理它,则raise语句的更简单形式允许您重新引发异常: "

我不明白为什么一个人会引发一个异常,处理它,然后重新引发它


如果程序员不想处理异常,他们不应该首先使用try..except语句???

如果您不将异常视为必须捕获/纠正的错误,而是将其视为信息交流的一种方式,这会有所帮助

有时,当您捕获到异常时,这是意料之中的,或者您可以找到解决它的方法。其他时候,异常意味着你不能做你想做的事情,所以你想向你自己的调用者提出一个异常,让他们知道为什么它不起作用

在这种情况下,有时您会捕获到阻碍计划的较低级别异常,然后引发自己的异常,可能会使用更具体的类型将自己的失败传达给调用方。有时也可以简单地将相同的异常发回调用方。在您只想让较低级别的异常一直传到调用方的情况下,您可能会选择不捕获它,但是如果您想记录一条消息或在您陷入火焰之前清理一些内部状态,该怎么办?这就是except/raise模式有用的地方

begin_complicated_process()
try:
    do_risky_thing()
except ShenanigansError:
    log("Did someone say shenanigans?!")
    unwind_complicated_process()
    raise
complete_complicated_process()

不!无论是否引发异常,都将执行finally;不能用finally替换except,反之亦然,并获得相同的行为。更合适的finally用法是,如果您需要执行某些终结操作,例如关闭文件,或者不管成功与否都停止计时器。我能想到的一个实际示例是,我在一个装饰器函数中使用了finally,该函数可以监视其他函数。在try块中,我启动一个计时器,然后执行我正在监视的包装函数,该函数在try下执行。在Exception下,我记录失败,然后引发,因为我不想干扰函数的操作,只需监视它。在另一种情况下,我记录了成功。在finally下,我停止计时器并报告它的值,因为我想这样做。
begin_complicated_process()
try:
    do_risky_thing()
except ShenanigansError:
    log("Did someone say shenanigans?!")
    unwind_complicated_process()
    raise
complete_complicated_process()