2013-12-18 3 views
5

Ich habe den folgenden Code:Python Anprobe außer mit der, wenn sonst

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

Dieses geschrieben werden könnte:

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

ich nicht glücklich bin, dass die Methode method_to_be_executed_in_case_of_exception_or_pk_is_false() erscheint zweimal, dh in anderen von beiden wenn und versuchen ... außer.

Gibt es einen besseren Weg, dies zu tun?

+2

Persönlich würde ich einen nackten 'except' darüber, dass als in dem Aufruf die gleiche Funktion von zwei Stellen mehr Sorgen zu machen. Sie sollten dies umschreiben, um nur die Ausnahmen zu erfassen, von denen Sie erwarten, dass sie ausgelöst werden. – Duncan

+0

Beachten Sie, dass Ihr zweites Beispiel _not_ dem ersten Beispiel entspricht, da 'method_to_be_executed_in_case_of_exception_or_pk_is_false 'selbst eine Ausnahme auslösen könnte, die dazu führt, dass es zweimal ausgeführt wird! – Eric

Antwort

4

Sie folgendes versuchen könnte:

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

Ich habe u pdated mit speziellen Ausnahmefangen, anstatt alle Ausnahmen zu fangen, was immer schlechte Praxis ist, wie andere darauf hingewiesen haben. Angenommen, Ihre Methode wirft einen der folgenden Werte auf CatchableExceptions.

+0

'assert' dient nur zum Debuggen. Es kann deaktiviert werden und es wird erwartet, dass Programme ordnungsgemäß ausgeführt werden, wenn 'assert' deaktiviert ist. – user2357112

+0

guten Punkt .. Ich denke, wir können die Ausnahme explizit auslösen, ohne für den gleichen Effekt geltend zu machen – qwwqwwq

+4

Wie ich auf den Beitrag selbst kommentierte, ist ein blankes 'except' eine schlechte Idee. Genauso ist das Werfen von 'Exception()' nicht gut; wirf immer eine entsprechende Ausnahme aus. In diesem Fall könnte etwas wie "ValueError" angebracht sein und das "except" sollte dann nur die erwarteten Exceptions behandeln, einschließlich der explizit angesprochenen Exceptions. – Duncan

-1
try: 
    if a_method_that_may_rise_an_exception(): 
     made_it = process_pk() 
except: 
    made_it = False 
if not made_it: 
    method_to_be_executed_in_case_of_exception_or_pk_is_false() 

?

+0

Sie brauchen ein 'except' – SethMMorton

+0

@SethMMorton Haha, yepp du .. danke! :) – Torxed

+1

Das Problem hier ist, dass 'process_pk()' auch eine Ausnahme auslösen könnte. Im Allgemeinen ist es am wenigsten fehleranfällig, so wenig Code wie möglich in Ihren Ausnahmebehandler zu schreiben, um das Risiko zu verringern, dass versehentlich die falsche Ausnahme abgefangen wird. – mgilson

10

Was ist so etwas wie:

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

Wirklich, haben wir nicht einmal brauchen die finally Klausel hier ...

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

Wenn Sie von der Funktion später zurückkehren, können Sie es wie folgt tun:

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