gpt4 book ai didi

python - "except"语句与参数相同的异常类两次

转载 作者:太空宇宙 更新时间:2023-11-04 01:35:20 25 4
gpt4 key购买 nike

在 Python 中,如何在 try/except 语句中使用具有相同异常名称的 except block 两次,而不需要将代码包装到另一个 try/except block ?

简单示例(这里每次 pages.get 调用都可能引发异常):

try:
page = pages.get(lang=lang)
except Page.DoesNotExist:
if not lang == default_lang:
page = pages.get(lang=default_lang)
else:
raise Page.DoesNotExist
except Page.DoesNotExist:
page = pages[0]

目前,在我的 Django 应用程序中,我是这样处理的(但我不想在此处“额外”try block ):

try:
try:
page = pages.get(lang=lang)
except Page.DoesNotExist:
if not lang == default_lang:
page = pages.get(lang=default_lang)
else:
raise Page.DoesNotExist
except Page.DoesNotExist:
page = pages[0]

感谢任何比上面更好的处理代码! :)

谢谢。

最佳答案

你也不能这样做并期望 elif 执行:

if foo == bar:
# do "if"
elif foo == bar:
# do "elif"

而且没有理由这样做,真的。对于您的 except 问题也是如此。

这是您的第一个代码片段的反汇编 Python 字节码:

 13           0 SETUP_EXCEPT            10 (to 13)

14 3 LOAD_GLOBAL 0 (NameError)
6 RAISE_VARARGS 1
9 POP_BLOCK
10 JUMP_FORWARD 44 (to 57)

15 >> 13 DUP_TOP
14 LOAD_GLOBAL 0 (NameError)
17 COMPARE_OP 10 (exception match)
20 POP_JUMP_IF_FALSE 35
23 POP_TOP
24 POP_TOP
25 POP_TOP

16 26 LOAD_GLOBAL 0 (NameError)
29 RAISE_VARARGS 1
32 JUMP_FORWARD 22 (to 57)

17 >> 35 DUP_TOP
36 LOAD_GLOBAL 0 (NameError)
39 COMPARE_OP 10 (exception match)
42 POP_JUMP_IF_FALSE 56
45 POP_TOP
46 POP_TOP
47 POP_TOP

18 48 LOAD_CONST 1 (1)
51 PRINT_ITEM
52 PRINT_NEWLINE
53 JUMP_FORWARD 1 (to 57)
>> 56 END_FINALLY
>> 57 LOAD_CONST 0 (None)
60 RETURN_VALUE

很明显,第一个 COMPARE_OPNameError(在偏移量 17 处)将捕获异常并跳转到第二次此类比较(在偏移量 36 处)之后。

关于python - "except"语句与参数相同的异常类两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10477634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com