2013-12-18 5 views
5

मैं है निम्नलिखित कोड: मैं खुश नहीं हूँअजगर की कोशिश को छोड़कर के साथ की यदि किसी और

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() प्रकट होता है दो बार, अर्थात्:

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

इस रूप में लिखा जा सकता है दोनों के अलावा और कोशिश करें ... को छोड़कर।

क्या ऐसा करने का कोई बेहतर तरीका है?

+2

व्यक्तिगत तौर पर मैं दो स्थानों से एक ही समारोह बुला की तुलना में एक नंगे 'except' होने के बारे में अधिक चिंतित होना चाहते हैं। आपको केवल उन अपवादों को पकड़ने के लिए इसे फिर से लिखना चाहिए जिन्हें आप फेंकने की उम्मीद करते हैं। – Duncan

+0

नोट करें कि आपका दूसरा उदाहरण _not_ पहले के बराबर है, क्योंकि 'method_to_be_executed_in_case_of_exception_or_pk_is_false' स्वयं अपवाद फेंक सकता है, जिससे इसे दो बार निष्पादित किया जा सकता है! – Eric

उत्तर

4

आप निम्न की कोशिश कर सकते:

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 में से एक को फेंक देगी।

+0

'assert' केवल डीबगिंग के लिए है। इसे अक्षम किया जा सकता है, और यदि 'assert' अक्षम है तो प्रोग्राम ठीक से चलने की उम्मीद है। – user2357112

+0

अच्छा बिंदु .. मुझे लगता है कि हम केवल उसी प्रभाव के लिए बिना किसी प्रभाव के अपवाद को बढ़ा सकते हैं – qwwqwwq

+4

जैसा कि मैंने पोस्ट पर टिप्पणी की थी, एक बेयर 'सिवाय' एक बुरा विचार है। इसी प्रकार 'अपवाद() 'फेंकना अच्छा नहीं है; हमेशा एक उपयुक्त अपवाद फेंक दें। इस मामले में 'ValueError' जैसी कुछ उपयुक्त हो सकती है और' सिवाय 'को तब केवल अपवादों को संभालना चाहिए, जिसमें स्पष्ट रूप से उठाया गया है। – 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

आपको 'छोड़कर' – SethMMorton

+0

@ सेठएम मॉर्टन हाहा, आप की जरूरत है .. धन्यवाद! :) – Torxed

+1

यहां समस्या यह है कि 'process_pk()' अपवाद भी बढ़ा सकता है। आम तौर पर, गलत अपवाद को गलती से पकड़ने के जोखिम को कम करने के लिए आपके अपवाद हैंडलर में जितना संभव हो उतना कम कोड डालने के लिए कम से कम त्रुटि प्रवण होती है। – mgilson

10

क्या की तरह कुछ के बारे में:

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() 
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() 
संबंधित मुद्दे