2009-06-19 17 views
19

मैंने सोचा कि एक अपवाद फेंकना अच्छा अभ्यास है, इसे यूआई पर वापस बुलबुला करने दें या कहीं भी जहां आप अपवाद लॉग करते हैं और इसके बारे में उपयोगकर्ता को सूचित करते हैं।पुनर्विक्रेता का कहना है कि 'सिंगल' फेंक 'कथन के साथ कैच क्लॉज अनावश्यक है'?

पुनर्विक्रेता का कहना है कि यह अनावश्यक है?

try 
{ 
    File.Open("FileNotFound.txt", FileMode.Open); 
} 
catch 
{ 
    throw; 
} 

उत्तर

53

क्योंकि

try { 
    File.Open("FileNotFound.txt", FileMode.Open); 
} catch { 
    throw; 
} 

File.Open(string, FileMode) करने के लिए कॉल, विफल रहता है तो या तो ठीक उसी अपवाद नमूना में अपनी तरह से ऊपर मिलेगा से

File.Open("FileNotFound.txt", FileMode.Open); 

अलग नहीं है यूआई के लिए।

उस catch ऊपर क्लॉज में, आप बस कुछ और किए बिना अपवाद को पकड़ रहे हैं और फिर से फेंक रहे हैं, जैसे कि लॉगिंग, लेनदेन को वापस लेना, अपवाद को लपेटना, इसमें अतिरिक्त जानकारी जोड़ने के लिए, या कुछ भी।

हालांकि

,

try { 
    File.Open("FileNotFound.txt", FileMode.Open); 
} catch(Exception ex) { 
    GetLogger().LogException(ex); 
    throw; 
} 

किसी भी अतिरिक्तताओं को शामिल नहीं हैं और ReSharper शिकायत नहीं करनी चाहिए। इसी तरह,

try { 
    File.Open("FileNotFound.txt", FileMode.Open); 
} catch(Exception ex) { 
    throw new MyApplicationException(
     "I'm sorry, but your preferences file could not be found.", ex); 
} 

अनावश्यक नहीं होगा।

+2

कैच-एंड-रीथ्रो होने के कारण कोई पकड़ नहीं है। फेंक साइट के बीच प्रत्येक पकड़ ब्लॉक के लिए अपवाद फ़िल्टर और पहली सफल पकड़ किसी भी 'आखिरकार' ब्लॉक निष्पादित करने से पहले चलाएगी; एक कैच-एंड-रेथ्रो इसके बाहर के सभी अपवाद फ़िल्टर चलाने से पहले चलाने के लिए सभी 'आखिरकार' ब्लॉक का कारण बन जाएगा। बीटीडब्ल्यू, रिचर्पर खुश है अगर कैच-एंड-रेथ्रो का पालन करना एक और अधिक सामान्य पकड़ ब्लॉक है जो कुछ करता है (तो कैच-एंड-रेथ्रो बाद वाले कैच ब्लॉक को बाईपास करने के लिए काम करेगा)? – supercat

17

क्योंकि उपरोक्त कथन समान व्यवहार किया है जैसे कि वह वहाँ नहीं थे। लेखन के रूप में ही:

File.Open("FileNotFound.txt", FileMode.Open); 
+0

तो बेहतर है तो कोशिश किए बिना कोड की उस पंक्ति को लिखें? – orandov

+8

हां। उस चीज़ को न पकड़ें जिसे आप संभालने नहीं जा रहे हैं। –

+0

@orandov - अनिवार्य रूप से नहीं। उदाहरण के लिए आप IOException को पकड़ सकते हैं और एप्लिकेशन अपवाद से प्राप्त एक और अर्थपूर्ण (उपयोगकर्ताओं के परिप्रेक्ष्य से) अपवाद फेंक सकते हैं। –

4

क्योंकि प्रयास में कोड पहले ही अपवाद फेंक रहा है।

यदि आप अपवाद को फिर से फेंकने के अलावा पकड़ ब्लॉक में कुछ और करने जा रहे हैं तो आप केवल अपवाद को पकड़ना और फिर से फेंकना चाहते हैं।

1

आपने कैच ब्लॉक में कोई प्रसंस्करण नहीं किया है, बस अपवाद को फिर से फेंक दिया है।

यह आपको चेतावनी देता है क्योंकि ऐसा करने में कोई बात नहीं है ... वहां ब्लॉक को पकड़ें।

इसके अलावा, एक और अच्छी युक्ति यह है कि "फेंक दें" स्टैक ट्रेस को संरक्षित नहीं करेगा बल्कि "फेंक देगा"।

4

क्योंकि यह अनावश्यक है।

+9

क्योंकि यह अनावश्यक है। –

+0

जब से सवाल एक वास्तविक उत्तर के जवाब के रूप में बता रहा है :)? – orandov

+7

"जब यह अनावश्यक है"। –

1

यह है कि जब ध्यान देने योग्य है ...

try 
{ 
    DoSomething(); 
} 
catch 
{ 
    throw; 
} 

... reduntant है, का पालन नहीं कर रहा है ...

try 
{ 
    DoSomething(); 
} 
catch (Exception ex) 
{ 
    // Generally a very bad idea! 
    throw ex; 
} 

यह दूसरा कोड स्निपेट एक codebase मैं विरासत में मिला के माध्यम से प्रचलित था कुछ परियोजनाएं पहले और इसका मूल अपवाद के स्टैक ट्रेस को छिपाने का बुरा प्रभाव पड़ा है। अपवाद को फेंकने से आपने अभी इस तरह पकड़ा है कि स्टैक ट्रेस का शीर्ष throw स्तर पर है, जिसमें DoSomething का कोई उल्लेख नहीं है या जो भी नेस्टेड विधि कॉल वास्तव में अपवाद का कारण बनती है।

शुभकामनाएं डीबगिंग कोड जो यह करता है!

+1

आर # को चेतावनी देने के लिए सेट किया जा सकता है कि उत्तरार्द्ध शायद 'इरादा नहीं है'। – AakashM

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