在Python中,我该如何使用except
具有相同异常名称的块两次try/except
语句,无需将代码包装到另一个语句中try/except
block?
简单的例子(这里each呼叫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
块在这里):
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]
任何比上面更好的处理代码都值得赞赏! :)
Thanks.
你也不能这样做并期望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_OP
to NameError
(在偏移量 17 处)将捕获异常并跳转到第二次此类比较之后(在偏移量 36 处)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)