2010-04-28 14 views
50

संभव डुप्लिकेट:
difference between throw and throw new Exception()"फेंक" क्या करता है अपने आप से करते हैं?

क्या सिर्फ

catch (Exception) 
{ 
    throw; 
} 

यह क्या करता है होने के बिंदु हो सकता है?

+0

के संभावित डुप्लिकेट [फेंक और नए अपवाद फेंक के बीच का अंतर()] (http://stackoverflow.com/q/2999298/) और [ट्राई/कैच के बीच का अंतर/फेंक और कोशिश/पकड़ (ई)/फेंक ई] (http://stackoverflow.com/q/1697216/)। –

उत्तर

80

अपने आप से, throw कीवर्ड उपरोक्त catch कथन द्वारा पकड़ा गया अपवाद फिर से उठाता है। यह आसान है अगर आप कुछ प्राथमिक अपवाद हैंडलिंग करना चाहते हैं (शायद एक लेनदेन वापस रोलिंग की तरह एक क्षतिपूर्ति कार्रवाई) और फिर कॉलिंग विधि के अपवाद को फिर से हटा दें।

इस विधि का एक चर में अपवाद को पकड़ने और उस उदाहरण को फेंकने पर एक महत्वपूर्ण लाभ है: यह मूल कॉल स्टैक को संरक्षित करता है। यदि आप पकड़ते हैं (अपवाद पूर्व) और फिर पूर्व फेंक देते हैं, तो आपका कॉल स्टैक केवल उस फेंक स्टेटमेंट पर शुरू होगा और आप मूल त्रुटि की विधि/रेखा खो देंगे।

+0

निष्पादित होने पर मैं सवाल है, 'catch' ब्लॉक है' फेंक के पूरे सामग्री को समझ के रूप में, ', तो कोई अतिरिक्त अपवाद हैंडलिंग। हालांकि हो सकता है कि मैं गलत हूं। – Gorpik

+0

बोरीस पॉइंट के प्रति आपकी प्रतिक्रिया क्या है? – CJ7

+0

बोरिस कि वास्तव में कुछ भी नहीं है प्रदान की उदाहरण में सही है, लेकिन मैं कॉल स्टैक के लिए किसी भी परिवर्तन होता है विश्वास नहीं है। मूल कॉल स्टैक संरक्षण की व्याख्या के लिए –

3

यह ठीक उसी त्रुटि को पुनर्स्थापित करता है, आपको इससे कुछ भी प्राप्त नहीं होता है।

catch (Exception) { 
    myLogger.Log(LogLevels.Exception, "oh noes!") 
    throw; 
} 

मैं शुरू में mistakingly सोचा यह आपके स्टैक हैं, लेकिन यह केवल यदि आप निम्न कार्य होगा:
कभी कभी तुम इस तरह अपने अपवाद interupting बिना कुछ वृक्षों की कटाई या कुछ करने के लिए पकड़ विधि का उपयोग कर सकते :

catch (Exception err) { 
    throw err; 
} 
+0

क्या आप सुनिश्चित हैं कि आपके पास अतिरिक्त स्टैक खोलना है, क्योंकि अकेले "फेंक" का उपयोग करने से मूल अपवाद को मूल रूप से सटीक स्टैकट्रैक के साथ मूल अपवाद को पुनर्स्थापित कर दिया जाएगा ... सही ?! – veggerby

+0

@boris: क्या आप कह रहे हैं कि कुछ कोड दो बार निष्पादित किया जाएगा? – CJ7

+0

@ वेगेर्बी: आप सही हैं, मैं उस मामले से भ्रमित था जहां आप पकड़ते हैं (अपवाद पूर्व) {फेंक पूर्व}। प्रश्न के कोड के मामले में, वास्तव में कुछ भी नहीं होता है। @Craig: नहीं कुछ भी नहीं दो बार –

3

केवल कारण मैं सोच सकता हूं कि यदि आप डिबगिंग के दौरान ब्रेकपॉइंट रखना चाहते हैं।
यह मुझे लगता है कि कुछ औजारों द्वारा उत्पन्न डिफ़ॉल्ट कोड भी है।

11

कभी-कभी आप कुछ इस तरह करना चाह सकते हैं:

try 
{ 
    // do some stuff that could cause SomeCustomException to happen, as 
    // well as other exceptions 
} 
catch (SomeCustomException) 
{ 
    // this is here so we don't double wrap the exception, since 
    // we know the exception is already SomeCustomException 
    throw; 
} 
catch (Exception e) 
{ 
    // we got some other exception, but we want all exceptions 
    // thrown from this method to be SomeCustomException, so we wrap 
    // it 
    throw new SomeCustomException("An error occurred saving the widget", e); 
} 
+2

+1 क्योंकि नया फेंक मूल अपवाद को पास करता है - बहुत, बहुत महत्वपूर्ण (-: – Murph

2

आप वर्तमान अपवाद rethrow, और कहा कि अपवाद अपने "स्रोत" और स्टैक ट्रेस रखेंगे।

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