web-dev-qa-db-ja.com

Python try-ifを除く

私は次のコードを持っています:

_    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()が2回表示されるのは不満です。つまり、ifとtry ... exceptの両方のelseに表示されます。

これを行うためのより良い方法はありますか?

9
Varghese Chacko

次のことを試すことができます。

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の1つをスローすると仮定します。

7
qwwqwwq

次のようなものはどうですか?

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()
11
mgilson

後で関数から戻ると、次のようになります。

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()
0
poke