2012-08-31 10 views
7

मैं एक स्थिति है जहाँ मैं एक विशिष्ट अपवाद प्रकार पकड़ने कर रहा हूँ अगर यह वास्तव में एक अपवाद मैं पकड़ने के लिए चाहते हैं की जाँच करने के अपवाद के संदेश का निरीक्षण, और फिर अपवाद नहीं तो फिर से ऊपर उठाने मिल गया है:पायथन में, मैं मूल कॉल स्टैक को बनाए रखने के दौरान अपवाद को फिर से कैसे उठा सकता हूं?

try: 
    # do something exception-prone 
except FooException as e: 
    if e.message == 'Something I want to handle': 
     # handle the exception 
    else: 
     raise e 

यह एक समस्या के साथ ठीक काम करता है। यदि मैं अपवाद को फिर से उठाता हूं, तो अपवाद मूल रूप से हुआ अपवाद स्थान के स्थान पर, फिर से उठाए गए लाइन पर (यानी raise e पर) उस अपवाद पर होता है। यह डिबगिंग के लिए आदर्श नहीं है, जहां आप जानना चाहते हैं कि मूल अपवाद कहां हुआ।

इस प्रकार मेरा प्रश्न: मूल अपवाद स्थान को बनाए रखते हुए इसे पकड़ने के बाद अपवाद को फिर से बढ़ाने या अन्यथा "पास" करने का कोई तरीका है?

नोट: यदि आप सोच रहे हैं कि वास्तविक स्थिति क्या है: मैं गतिशील रूप से __import__ का उपयोग करके कुछ मॉड्यूल आयात कर रहा हूं। मैं इस मामले के साथ सौदा करने के लिए ImportError को पकड़ रहा हूं कि इनमें से कोई भी मॉड्यूल मौजूद नहीं है। हालांकि, इस मामले में इनमें से किसी भी मॉड्यूल में एक आयात कथन होता है जो ImportError उठाता है, मैं चाहता हूं कि उन "असली" (मेरे आवेदन के दृष्टिकोण से) अपवाद उठाए जाएं - और मूल स्थान पर जहां तक ​​डिबगिंग हो उपकरण चिंतित हैं।

उत्तर

7

बस कार्य करें:

raise 
बजाय

raise eraising exceptions पर ट्यूटोरियल अनुभाग देखें, और यह भी language reference on raise statements:

कोई भाव मौजूद हैं, बढ़ा पिछले अपवाद है कि वर्तमान क्षेत्र में सक्रिय था फिर से उठाती है। यदि वर्तमान दायरे में कोई अपवाद सक्रिय नहीं है, तो टाइपरर अपवाद उठाया जाता है यह इंगित करता है कि यह एक त्रुटि है (यदि आईडीईएल के तहत चल रहा है, तो एक पंक्ति। इसके बजाय लक्षण अपवाद उठाया गया है)।

+0

दुह! आसान। मैं कोशिश/छोड़ने के लिए संदर्भ को देख रहा था और उठाने के लिए भूल गया था। धन्यवाद। – Ghopper21

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

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