2009-10-23 8 views

उत्तर

58

नहीं, finally समय sys.exc_info सभी कोई नहीं है, कि क्या वहाँ एक अपवाद या नहीं किया गया है। का उपयोग करें:

try: 
    whatever 
except: 
    here sys.exc_info is valid 
    to re-raise the exception, use a bare `raise` 
else: 
    here you know there was no exception 
finally: 
    and here you can do exception-independent finalization 
+0

धन्यवाद परीक्षण किया गया। sys.exc_info (एक छोड़कर खंड में) मुझे – Goutham

+0

की आवश्यकता है जो पाइथन 3 के रूप में है।?, आप 'sys.exc_info' को 'अंत में'' ब्लॉक से एक्सेस कर सकते हैं। – Kentzo

+0

@ कंट्जो मैंने अभी इसे पायथन 3.6 में बाहर करने की कोशिश की। जब आपने अपवाद उठाया तो अंत में ब्लॉक में sys.exc_info() 'रिटर्न' (कोई नहीं, कोई नहीं, कोई नहीं) '। – Jonathan

10

finally ब्लॉक के लिए कि क्या एक अपवाद उत्पन्न हुआ था या नहीं निष्पादित किया जाएगा, ताकि जोश बताते हैं, आप बहुत संभावना नहीं है वहाँ यह निपटने जाना चाहते हैं।

यदि आपको वास्तव में उठाए गए अपवाद के मूल्य की आवश्यकता है, तो आपको except ब्लॉक में अपवाद पकड़ना चाहिए, या तो इसे उचित तरीके से संभाल लें या इसे फिर से उठाएं, और उसके बाद अंत में ब्लॉक में उस मान का उपयोग करें - - उम्मीद के साथ कि यह कभी भी सेट नहीं किया जा सकता है, अगर निष्पादन के दौरान कोई अपवाद नहीं उठाया गया था।

import sys 

exception_name = exception_value = None 

try: 
    # do stuff 
except Exception, e: 
    exception_name, exception_value = sys.exc_info()[:2] 
    raise # or don't -- it's up to you 
finally: 
    # do something with exception_name and exception_value 
    # but remember that they might still be none 
3

असल में, अन्य उत्तरों थोड़ा अस्पष्ट हैं। तो, मुझे इसे स्पष्ट करने दें। आप अंततः ब्लॉक से sys.exc_info() का आह्वान कर सकते हैं। हालांकि, इसका उत्पादन इस बात पर निर्भर करेगा कि अपवाद वास्तव में उठाया गया है या नहीं।

import sys 

def f(i): 

    try: 
     if i == 1: 
      raise Exception 
    except Exception as e: 
     print "except -> " + str(sys.exc_info()) 
    finally: 
     print "finally -> " + str(sys.exc_info()) 

f(0) 
f(1) 

>>> 
finally -> (None, None, None) 
except -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x029438F0>) 
finally -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x029438F0>) 

इस प्रकार, आप हमेशा अंत में ब्लॉक में पता कर सकते हैं, चाहे अपवाद उठाया गया था, अगर यह पहले के स्तर सुविधा नहीं होती। लेकिन sys.exc_info() अलग-अलग व्यवहार करेगा जब कॉल स्टैक की लंबाई 1 से अधिक हो जाएगी, जैसा कि नीचे उदाहरण में दिखाया गया है। अधिक जानकारी के लिए, How sys.exc_info() works?

import sys 

def f(i): 

    try: 
     if i == 1: 
      raise Exception 
    except Exception as e: 
     print "except -> " + str(sys.exc_info()) 
    finally: 
     print "finally -> " + str(sys.exc_info()) 

def f1(i): 
    if i == 0: 
     try: 
      raise Exception('abc') 
     except Exception as e: 
      pass 

    f(i) 

f1(0) 
f1(1) 

>>> 
finally -> (<type 'exceptions.Exception'>, Exception('abc',), <traceback object at 0x02A33940>) 
except -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x02A33990>) 
finally -> (<type 'exceptions.Exception'>, Exception(), <traceback object at 0x02A33990>) 

मुझे आशा है कि का उल्लेख यह चीजों को थोड़ा स्पष्ट कर देता है।

+1

यह केवल python2 के लिए सच है। – coldfix

+0

@coldfix क्या आपका मतलब यह है कि यह केवल python3 के लिए सच है? –

+1

नहीं, मैं दोनों python2 और python3 पर स्क्रिप्ट निष्पादित करता हूं। पायथन 3 पर (मामूली वाक्य रचनात्मक मुद्दों को ठीक करने के बाद), 'एफ (1) 'के लिए आउटपुट' अंत में -> (कोई नहीं, कोई नहीं, कोई नहीं) 'है, इसलिए आप अंततः उस ब्लॉक को अपवाद नहीं प्राप्त कर सकते हैं। – coldfix

0

से ठीक पहले tryexcept ब्लॉक संभावित अपवाद के लिए एक खाली चर को परिभाषित:

import sys 

exception = None 

try: 
    result = 1/0 
except ZeroDivisionError as e: 
    exception = sys.exc_info() # or "e" 
finally: 
    if exception: 
     print(exception) 
    else: 
     print('Everything is fine') 

अजगर 3.6 पर

संबंधित मुद्दे