2012-07-01 9 views
24

मैं & रखना चाहता हूं पाइथन 2.5, 2.7 और 3.2 दोनों में अपवाद के त्रुटि मान का उपयोग करें।कोशिश करें ... सिवाय ... पाइथन 2.5 में त्रुटि के रूप में - पायथन 3.x

अजगर 2.5 और 2.7 में (लेकिन 3.x नहीं), इस काम करता है:

try: 
    print(10 * (1/0)) 
except ZeroDivisionError, error:  # old skool 
    print("Yep, error caught:", error) 

अजगर 2.7 में और 3.2 (लेकिन 2.5 में), यह काम करता है:

try: 
    print(10 * (1/0)) 
except (ZeroDivisionError) as error: # 'as' is needed by Python 3 
    print("Yep, error caught:", error) 

है इस उद्देश्य के लिए कोई कोड है जो 2.5, 2.7 और 3.2 दोनों में काम करता है?

धन्यवाद

+0

आप अपने 2.5 अपग्रेड नहीं कर सकते:

except ValueError: _, err, _ = sys.exc_info() #.. use err... 

इस के बराबर है:

तरह से एक अपवाद को पकड़ने और अपवाद है कि उन सभी को में काम करता है के लिए एक संदर्भ पाने के लिए यह है कोड कम से कम 2.7 और अधिमानतः 3? – Ben

+0

'को छोड़कर (ZeroDivisionError) को त्रुटि के रूप में: 'पायथन 2.7 में ठीक काम करता है http://ideone.com/KfHBs –

+2

पायथन 3 स्पष्ट रूप से पीछे की ओर संगत नहीं है। अपने आप को सिंटैक्स के सीमित सबसेट तक सीमित क्यों करें, दोनों भाषाएं समर्थन करती हैं? – Cameron

उत्तर

36

आप 3.2 के माध्यम से पर अजगर 2.5 एक कोड बेस का उपयोग कर सकते हैं, लेकिन यह आसान नहीं है। आप coverage.py पर एक नज़र डालें, जो एक कोड कोड के साथ 2.3 से 3.3 पर चलता है।

except ValueError as err: 
    #.. use err... 
+0

काम करता है! धन्यवाद! – user1492917

+1

यह माना जाता है कि यह काम करता है, लेकिन शायद समस्या की तुलना में इलाज खराब (उलझन) है। 2.5 के लिए पैकेजिंग कोड के दौरान एक और तरीका "as" और कोड रूपांतरण स्क्रिप्ट का उपयोग करेगा। YMMV। –

+0

समस्या यह है कि पायथन संस्करणों के बीच इसके वाक्यविन्यास में महत्वपूर्ण और अनावश्यक परिवर्तन करता है। इसे सी में कल्पना करें: संस्करण x.y से आप "{" के बजाय "@" का उपयोग करते हैं :) यह सादा बेवकूफ है और इलाज बहुत बेहतर है - आखिरकार हम सभी इसे काम करना चाहते हैं! – Terminus