Python的try-except与if else结合使用

20

我有以下代码:

    try:
        pk = a_method_that_may_raise_an_exception()
    except:
        method_to_be_executed_in_case_of_exception_or_pk_is_false()
    else:
        if pk:
            process_pk()
        else:
            method_to_be_executed_in_case_of_exception_or_pk_is_false()

这可以写成:

    try:
        if a_method_that_may_raise_an_exception():
            process_pk()
        else:
            method_to_be_executed_in_case_of_exception_or_pk_is_false()
    except:
        method_to_be_executed_in_case_of_exception_or_pk_is_false()

我不高兴这个 method_to_be_executed_in_case_of_exception_or_pk_is_false() 方法出现了两次,即在if和try...except的else中都出现了。

有没有更好的方法来解决这个问题?


2
个人而言,我更担心的是有一个裸的 except 而不是从两个地方调用同一个函数。你应该重写代码,只捕获你预期会抛出的异常。 - Duncan
请注意,第二个示例与第一个示例不等价,因为 method_to_be_executed_in_case_of_exception_or_pk_is_false 可能会抛出异常,导致它被执行两次! - Eric
3个回答

19

那这个怎么样:

try:
    pk = a_method_that_may_rise_an_exception()
except HandleableErrors:
    pk = False
finally:
    if pk:
        process_pk()
    else:
        method_to_be_executed_in_case_of_exception_or_pk_is_false()

实际上,我们甚至不需要在这里使用finally子句...

try:
    pk = a_method_that_may_rise_an_exception()
except HandleableErrors:
    pk = False

if pk:
    process_pk()
else:
    method_to_be_executed_in_case_of_exception_or_pk_is_false()

16

你可以尝试以下方法:

class PKIsFalseException(Exception):
    pass

try: 
    pk = a_method_that_may_raise_an_exception()
    if not pk: raise PKIsFalseException()
except (PKIsFalseException, CatchableExceptions):
    method_to_be_executed_in_case_of_exception_or_pk_is_false()

我已经更新了代码,使用了特定的异常捕获方式,而不是像其他人指出的那样捕获所有异常,这种方法通常是不好的实践。假设你的方法会抛出CatchableExceptions之一。


assert 仅用于调试。它可以被禁用,如果 assert 被禁用,程序应该能够正常运行。 - user2357112
好的观点..我想我们可以明确地引发异常,而不需要使用assert来达到同样的效果。 - qwwqwwq
5
正如我在帖子本身上发表的评论一样,一个裸露的except是一个不好的想法。同样地,抛出Exception()也不好;总是抛出一个适当的异常。在这种情况下,像ValueError这样的异常可能是适当的,except应该处理预期的异常,包括明确引发的异常。 - Duncan

0
如果你之后要从函数中返回,可以这样做:
try:
    pk = a_method_that_may_rise_an_exception()
except:
    pass
else:
    if pk:
        process_pk()
        return

method_to_be_executed_in_case_of_exception_or_pk_is_false()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接