2012-02-27 11 views
16

मैं निम्नलिखित कोड है:पकड़ने अपवाद, डेटा जोड़ें, और rethrow यह

try 
{ 
    OnInitialize(); 
} 
catch (PageObjectLifecycleException exception) 
{ 
    exception.OldLifecycleState = CurrentLifecycleState; 
    exception.RequestedLifecycleState = LifecycleState.Initialized; 
    throw exception; 
} 

मैं एक अपवाद को पकड़ने के लिए, यह करने के लिए कुछ और अधिक डेटा जोड़ने के लिए, और यह rethrow। Resharper मुझे (सही) है कि एक rethrow संभवतः इरादा है चेतावनी दी है और करने के लिए इसे बदलने का सुझाव:

throw; 

लेकिन मैं सोच रहा हूँ: यह सही ढंग से संशोधित अपवाद या असंशोधित मूल एक rethrow होगा?

संपादित करें: "इसे आज़माएं और देखें" टिप्पणियों के जवाब में: मैं C++ से आने वाले सी # के लिए नया हूं। सी ++ में आपको अक्सर इस तरह के कोने के मामलों में अपरिभाषित व्यवहार मिलता है और मुझे इसमें दिलचस्पी है कि मैं क्या चाहता हूं वास्तव में यह आधिकारिक रूप से कैसे काम करता है।

+6

यह कोशिश करो और देखो क्या होता है फिर से फेंक? –

+0

जो भी संदर्भ इंगित कर रहा है उसे फिर से उखाड़ फेंक देगा - आपके मामले में संशोधित "अपवाद"। –

उत्तर

8

यह संशोधित अपवाद के संदर्भ को फेंक देगा।

हालांकि मुझे यकीन नहीं है कि यह अच्छी प्रोग्रामिंग शैली है या नहीं। एक नया अपवाद बनाने पर विचार करें और PageObjectLifecycleException को इसके आंतरिक अपवाद के रूप में जोड़ें। इस तरह हैंडलिंग कोड यह सुनिश्चित कर सकता है कि इसमें सही अतिरिक्त जानकारी है या नहीं।

+0

मुझे भी, यह एक असली बग हैडर। उदाहरण के लिए गहराई से वापस पारित डेटा पर बाहरी पकड़ ब्लॉक trampling। –

+0

कोड नमूना सरलीकृत है। कोई मौजूदा डेटा ओवरराइट नहीं किया जाएगा, केवल कुछ गायब अतिरिक्त डेटा की आपूर्ति की जाती है। –

+0

@ टोनी होपकिन्सन 'अपवाद। डेटा' लगता है जैसे यह इस उद्देश्य के लिए होना चाहिए ([यहां] (https://msdn.microsoft.com/en-us/library/system.exception.data (v = vs.110) .aspx)) – drzaus

2

वर्तमान अपवाद फिर से फेंक दिया गया है, हालांकि मुझे यकीन नहीं है कि आपका पैटर्न बहुत अच्छा और रखरखाव वाला है।

22

मुझे पता है कि उत्तर पहले ही चुना जा चुका है लेकिन यहां विषय पर थोड़ी अधिक जानकारी है।

try { 
    // code 
} 
catch(Exception e) { 
    throw e; 
} 

ऊपर कोड जब आईएल में संकलित एक तर्क के रूप संभाला अपवाद के लिए एक संदर्भ गुजर throw के लिए एक कॉल का उत्पादन करेगा। जैसा कि आप शायद जानते हैं, आप अपवाद बढ़ाने के लिए अपने कोड में कहीं से भी throw पर कॉल कर सकते हैं।

try { 
    // code 
} 
catch(Exception e) { 
    throw; 
} 

ऊपर कोड जब आईएल में संकलित rethrow के लिए एक कॉल का उत्पादन करेगा। throw के रूप में यह rethrow के रूप में अलग है यह संकेत करने के लिए प्रयोग किया जाता है कि जिस ब्लॉक में अपवाद संभाला गया था, किसी कारण से इसे संभालने का फैसला नहीं किया गया है और इसलिए जिम्मेदारी उच्च आदेश पकड़ ब्लॉक (अगले एक ऊपर) को दी जानी चाहिए।

rethrow विधि वर्तमान कॉल स्टैक ट्रेस संरक्षित करता है ताकि अपवाद की उत्पत्ति को ट्रैक किया जा सके। हालांकि, throw विधि एक नया कॉल स्टैक ट्रेस शुरू करता है। मुझे लगता है कि एक बार समझने के बाद यह समझ में आता है कि दो तरीकों का क्या उपयोग किया जाना है।

मेरे अनुभव में आप throw exception; का उपयोग करते हैं जब आप किसी कारण से अपवाद फेंकना चाहते हैं (उदाहरण के लिए किसी ऑब्जेक्ट का सत्यापन विफल हुआ) और आप कुछ लॉगिंग करने के बाद throw; को कैच स्टेटमेंट में उपयोग करेंगे (यानी आपके पास अभी भी है उस ऑब्जेक्ट में उपयोगी जानकारी तक पहुंच जो उच्च स्तर पर अपवाद हैंडलिंग जिम्मेदारियों को पार करने से पहले सत्यापन विफल रही)।

आपके उदाहरण में मैं सुझाव दूंगा कि यदि आपको अपवाद में अधिक जानकारी जोड़ने की आवश्यकता है तो आपके पास एक बिल्कुल नया अपवाद बनाने और इसे बढ़ाने का मामला है। तो आप throw exception; विधि का उपयोग करेंगे जहां "अपवाद" एक अतिरिक्त अपवाद है जिसमें मूल जानकारी और मूल रूप से अपवाद शामिल है।

आशा है कि मदद करता है!

जेम्स

9

आप अतिरिक्त जानकारी डेटा में जोड़ सकते हैं और साथ throw तो यह अपने मूल रूप को बनाए रखता है अपवाद और callstack

try 
{ 
    ... 
} 
catch (PageObjectLifecycleException exception) 
{ 
    exception.Data.Add("additional data", "the additional data"); 
    throw; 
} 
+2

यह वास्तव में स्वीकार्य उत्तर होना चाहिए, यही वह डेटा है जो 'डेटा' है। जब तक एक महत्वपूर्ण संघर्ष के खिलाफ एक गार्ड, और यह ध्यान में रखता है कि शब्दकोश में जो भी जानकारी निहित है 1) कॉल श्रृंखला का प्रचार किया गया है और 2) रास्ते में संशोधित किया जा सकता है, यह डिबगिंग को कम करने के लिए उपयोगी जानकारी जोड़ने का एक शानदार तरीका है। –

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