Python尝试 - 除了if else

时间:2013-12-18 07:56:18

标签: 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()

这可以写成:

    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中的其他地方......除了。

有更好的方法吗?

3 个答案:

答案 0 :(得分: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()

真的,我们甚至不需要这里的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()

答案 1 :(得分:6)

您可以尝试以下方法:

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

之一

答案 2 :(得分: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()