Python尝试 - 除了if else

Var*_*cko 10 python refactoring try-catch

我有以下代码:

    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()
Run Code Online (Sandbox Code Playgroud)

这可以写成:

    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()
Run Code Online (Sandbox Code Playgroud)

我很高兴该方法method_to_be_executed_in_case_of_exception_or_pk_is_false() 出现两次,即在if和try中的其他地方......除外.

有一个更好的方法吗?

mgi*_*son 11

怎么样的:

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()
Run Code Online (Sandbox Code Playgroud)

真的,我们甚至不需要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()
Run Code Online (Sandbox Code Playgroud)


qww*_*wwq 8

您可以尝试以下方法:

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()
Run Code Online (Sandbox Code Playgroud)

我已经更新了特定的异常捕获而不是捕获所有异常,这总是不好的做法,正如其他人指出的那样.假设您的方法将抛出其中一个CatchableExceptions.

  • 正如我对帖子本身所评论的那样,一个简单的"除了"是一个坏主意.同样抛出`Exception()`并不好; 总是抛出适当的例外.在这种情况下,类似于`ValueError`的东西可能是合适的,然后`except`应该只处理预期的异常,包括显式引发的异常. (5认同)