引发异常,处理它。只不过是为了再次引发异常;Python

问题描述 投票:1回答:1

我在看Python教程。

我看到有一部分说

'''如果你需要确定一个异常是否被引发,但又不打算处理它,一个更简单的形式的 raise 语句允许你重新引发异常:'''

try:
    raise NameError('HiThere')
except NameError:
    print('An exception flew by!')
    raise

我不明白为什么要引发一个异常,处理后再重新引发?

如果程序员不想处理异常,就不应该一开始就使用try.except语句?

python
1个回答
4
投票

如果你不把异常看作是必须被抓到纠正的 "错误",而是把它看作是一种信息交流的方式,就会有帮助。

有时,当你抓住一个异常时,它是预期的,或者你可以找到一种方法来解决它。 其他时候,异常意味着你不能做你想做的事情,所以你想向自己的呼叫者提出异常,让他们知道为什么不能成功。

当你遇到这种情况时,有时你会抓住那个阻挠你计划的低级异常,然后提出你自己的异常(也许是用更具体的类型)来向调用者传达你自己的失败。 有时,简单地引发同样的异常返回给调用者可能也会有同样的效果。 在这种情况下,如果你只是想让低层的异常一直传递给调用者,你就可以 可能 选择干脆不抓,但如果你想在火烧眉毛之前记录一条消息或清理一些内部状态怎么办? 这时就需要 exceptraise 模式是有用的。

begin_complicated_process()
try:
    do_risky_thing()
except ShenanigansError:
    log("Did someone say shenanigans?!")
    unwind_complicated_process()
    raise
complete_complicated_process()
© www.soinside.com 2019 - 2024. All rights reserved.