हम एक WPF आवेदन कर रहे हैं, जहां इसके कुछ भाग रनटाइम पर अपवाद फेंक सकते हैं। मैं विश्व स्तर पर किसी भी अनछुए अपवाद को पकड़ना चाहता हूं और उन्हें लॉग इन करना चाहता हूं, लेकिन अन्यथा प्रोग्राम निष्पादन जारी रखें जैसे कि कुछ भी नहीं हुआ (जैसे वीबी की तरह On Error Resume Next
)।
क्या यह C # में संभव है? और यदि हां, तो वास्तव में मुझे अपवाद हैंडलिंग कोड डालने की आवश्यकता कहां होगी?
वर्तमान में मैं ऐसा कोई भी बिंदु नहीं देख सकता जहाँ मैं try
/ a को लपेट सकूँ catch
और जो सभी अपवादों को पकड़ सकता है। और तब भी मैं कैच की वजह से जो कुछ भी किया गया था उसे छोड़ देता। या मैं यहाँ बुरी तरह गलत दिशाओं में सोच रहा हूँ?
ईटीए: क्योंकि नीचे कई लोगों ने इसे इंगित किया है: आवेदन परमाणु ऊर्जा संयंत्रों को नियंत्रित करने के लिए नहीं है। यदि यह क्रैश होता है तो यह बहुत बड़ी बात नहीं है, लेकिन यादृच्छिक रूप से अपवाद जो कि ज्यादातर यूआई-संबंधित हैं, उस संदर्भ में एक उपद्रव हैं जहां इसका उपयोग किया जाएगा। उनमें से कुछ थे (और शायद अभी भी हैं) क्योंकि यह एक प्लगइन वास्तुकला का उपयोग करता है और दूसरों द्वारा बढ़ाया जा सकता है (उस मामले में भी; इसलिए कोई भी अनुभवी डेवलपर्स जो पूरी तरह से त्रुटि-मुक्त कोड लिखने में सक्षम नहीं हैं)।
अपवाद के रूप में जो पकड़े जाते हैं: मैं उन्हें लॉग फ़ाइल में लॉग करता हूं, जिसमें पूर्ण स्टैक ट्रेस भी शामिल है। यह उस अभ्यास का पूरा बिंदु था। बस उन लोगों का मुकाबला करने के लिए जो वीबी के ओआरएन पर मेरी सादृश्य को सचमुच ले जा रहे थे।
मुझे पता है कि कुछ वर्गों की त्रुटियों को नजरअंदाज करना खतरनाक है और मेरे आवेदन के उदाहरण को दूषित कर सकता है। जैसा कि पहले कहा गया है, यह कार्यक्रम किसी के लिए भी मिशन-क्रिटिकल नहीं है। उनके सही दिमाग में कोई भी उस पर मानव सभ्यता के अस्तित्व को दांव पर नहीं लगाएगा। यह बस कुछ डिज़ाइन के परीक्षण के लिए एक छोटा सा उपकरण है, जो wrt से संपर्क करता है। सॉफ्टवेयर इंजीनियरिंग।
आवेदन के तत्काल उपयोग के लिए कई चीजें नहीं हैं जो एक अपवाद पर हो सकती हैं:
- कोई अपवाद हैंडलिंग - त्रुटि संवाद और अनुप्रयोग से बाहर निकलना। प्रयोग को दोहराया जाना चाहिए, हालांकि किसी अन्य विषय के साथ होने की संभावना है। कोई त्रुटि लॉग नहीं की गई है, जो दुर्भाग्यपूर्ण है।
- सामान्य अपवाद हैंडलिंग - सौम्य त्रुटि फंस गई, कोई नुकसान नहीं हुआ। विकास के दौरान हम जो भी त्रुटियां देख रहे थे, उससे यह सामान्य मामला होना चाहिए। इस तरह की त्रुटियों को अनदेखा करने के तत्काल परिणाम नहीं होने चाहिए; कोर डेटा संरचनाओं का अच्छी तरह से परीक्षण किया जाता है कि वे आसानी से इससे बच जाएंगे।
- सामान्य अपवाद हैंडलिंग - गंभीर त्रुटि, संभवतः बाद में दुर्घटनाग्रस्त हो गई। ऐसा शायद ही कभी हो सकता है। हमने इसे अब तक कभी नहीं देखा है। त्रुटि वैसे भी लॉग होती है और क्रैश अपरिहार्य हो सकता है। तो यह वैचारिक रूप से पहले मामले के समान है। सिवाय इसके कि हमारे पास एक स्टैक ट्रेस है। और अधिकांश मामलों में उपयोगकर्ता नोटिस भी नहीं करेगा।
कार्यक्रम द्वारा उत्पन्न प्रयोग डेटा के लिए: एक गंभीर त्रुटि सबसे खराब होगी, जिसके कारण कोई डेटा रिकॉर्ड नहीं किया जाएगा। सूक्ष्म परिवर्तन जो कभी-कभी प्रयोग के परिणाम को बदल देते हैं वे बहुत कम संभावनाएं हैं। और उस स्थिति में भी, यदि परिणाम संदिग्ध प्रतीत होता है कि त्रुटि लॉग की गई थी; यदि यह कुल मिलाकर हो तो कोई भी डेटा बिंदु को फेंक सकता है।
संक्षेप में: हां, मैं अपने आप को अभी भी कम से कम आंशिक रूप से समझदार मानता हूं और मैं एक वैश्विक अपवाद से निपटने वाली दिनचर्या पर विचार नहीं करता हूं, जो प्रोग्राम को पूरी तरह से खराब होने के लिए छोड़ देता है। जैसा कि पहले दो बार कहा गया था, इस तरह का निर्णय वैध हो सकता है, आवेदन पर निर्भर करता है। इस मामले में यह एक वैध निर्णय था और कुल और बकवास नहीं था। किसी भी अन्य अनुप्रयोग के लिए जो निर्णय अलग दिख सकता है। लेकिन कृपया मुझ पर या अन्य लोगों पर आरोप न लगाएं, जिन्होंने उस परियोजना पर काम किया, ताकि हम त्रुटियों को नजरअंदाज करते हुए सिर्फ इसलिए दुनिया को उड़ा दें।
साइड नोट: उस एप्लिकेशन के लिए ठीक एक उपयोगकर्ता है। यह विंडोज या ऑफिस जैसी कोई चीज नहीं है जो लाखों लोगों द्वारा उपयोग की जाती है, जहां उपयोगकर्ता को अपवाद बबल होने की लागत पहले से ही पहले से बहुत अलग होगी।
On Error Resume Next
C # में VB जैसा कोड-फ्लो संभव नहीं है। एक Exception
(सी # में "त्रुटियां" नहीं होने के बाद ) आप बस अगले बयान के साथ फिर से शुरू नहीं कर सकते हैं: निष्पादन एक catch
ब्लॉक में जारी रहेगा - या नीचे दिए गए उत्तरों में वर्णित घटना संचालकों में से एक में।