संपादित करें: मैं दूसरों के साथ, जो कह रहा हूं कि C # 6.0 के रूप में, अपवाद फ़िल्टर अब जाने के लिए एक बिल्कुल ठीक तरीका है:catch (Exception ex) when (ex is ... || ex is ... )
सिवाय इसके कि मैं अभी भी एक-लाइन लाइन से नफरत करता हूं और निम्नलिखित की तरह व्यक्तिगत रूप से कोड को बाहर करूंगा। मुझे लगता है कि यह उतना ही कार्यात्मक है जितना कि यह सौंदर्यवादी है, क्योंकि मेरा मानना है कि यह समझ में सुधार करता है। कुछ असहमत हो सकते हैं:
catch (Exception ex) when (
ex is ...
|| ex is ...
|| ex is ...
)
मूल:
मुझे पता है कि मुझे यहां पार्टी में थोड़ी देर हो गई है, लेकिन पवित्र धुआं ...
पीछा करने के लिए सीधे काटना, इस तरह का एक पहले वाला उत्तर दोहराता है, लेकिन यदि आप वास्तव में कई अपवाद प्रकारों के लिए एक सामान्य क्रिया करना चाहते हैं और पूरी विधि को एक विधि के दायरे में साफ सुथरा रखना चाहते हैं, तो बस एक लंबोदर का उपयोग क्यों न करें निम्नलिखित की तरह कुछ करने के लिए / बंद / इनलाइन समारोह? मेरा मतलब है, संभावना बहुत अच्छी है कि आप यह महसूस करेंगे कि आप बस उस अलग तरीके को बंद करना चाहते हैं जिसे आप सभी जगह उपयोग कर सकते हैं। लेकिन तब यह करना बहुत आसान होगा कि वास्तव में बाकी कोड को संरचनात्मक रूप से बदले बिना। सही?
private void TestMethod ()
{
Action<Exception> errorHandler = ( ex ) => {
// write to a log, whatever...
};
try
{
// try some stuff
}
catch ( FormatException ex ) { errorHandler ( ex ); }
catch ( OverflowException ex ) { errorHandler ( ex ); }
catch ( ArgumentNullException ex ) { errorHandler ( ex ); }
}
मैं मदद नहीं कर सकता, लेकिन आश्चर्य ( चेतावनी: थोड़ा विडंबना / व्यंग्य आगे) क्यों पृथ्वी पर मूल रूप से सिर्फ निम्नलिखित को बदलने के लिए यह सभी प्रयास किए जाते हैं:
try
{
// try some stuff
}
catch( FormatException ex ){}
catch( OverflowException ex ){}
catch( ArgumentNullException ex ){}
... इस अगले कोड गंध के कुछ पागल भिन्नता के साथ, मेरा मतलब है उदाहरण, केवल यह दिखावा करने के लिए कि आप कुछ कीस्ट्रोक्स बचा रहे हैं।
// sorta sucks, let's be honest...
try
{
// try some stuff
}
catch( Exception ex )
{
if (ex is FormatException ||
ex is OverflowException ||
ex is ArgumentNullException)
{
// write to a log, whatever...
return;
}
throw;
}
क्योंकि यह निश्चित रूप से स्वचालित रूप से अधिक पठनीय नहीं है।
दी, मैंने /* write to a log, whatever... */ return;
पहले उदाहरण में से तीन समान उदाहरणों को छोड़ दिया ।
लेकिन यह मेरी बात है। Y'all कार्यों / विधियों के बारे में सुना है, है ना? गंभीरता से। एक सामान्य ErrorHandler
फ़ंक्शन लिखें और, प्रत्येक कैच ब्लॉक से इसे कॉल करें।
यदि आप मुझसे पूछते हैं, तो दूसरा उदाहरण ( if
और is
खोजशब्दों के साथ) दोनों काफी कम पठनीय है, और साथ ही साथ आपकी परियोजना के रखरखाव चरण के दौरान काफी अधिक त्रुटि-प्रवण है।
रखरखाव चरण, जो किसी के लिए प्रोग्रामिंग के लिए अपेक्षाकृत नया हो सकता है, में आपकी परियोजना के संपूर्ण जीवनकाल का 98.7% या अधिक शामिल है, और रखरखाव करने वाले घटिया schmuck लगभग निश्चित रूप से आपके अलावा कोई और होने जा रहा है। और एक बहुत अच्छा मौका है कि वे अपना 50% समय आपके नाम को कोसते हुए काम पर लगाएंगे।
और निश्चित रूप से आप पर FxCop छाल करता है और इसलिए आपको अपने कोड में एक विशेषता भी जोड़ना होगा जो चल रहे कार्यक्रम के साथ ठीक करने के लिए ज़िप है, और केवल एक समस्या को अनदेखा करने के लिए FxCop को बताना है कि 99.9% मामलों में यह पूरी तरह से है झंडी दिखाने में सही। और, क्षमा करें, मुझसे गलती हो सकती है, लेकिन क्या वास्तव में आपके ऐप में संकलित "अनदेखी" विशेषता समाप्त नहीं होती है?
क्या पूरी if
परीक्षा को एक पंक्ति में रखना इसे और अधिक पठनीय बना देगा? मुझे ऐसा नहीं लगता। मेरा मतलब है, मेरे पास एक और प्रोग्रामर था जो बहुत पहले एक बार बहस कर चुका था कि एक लाइन पर अधिक कोड डालने से यह "और तेज" होगा। लेकिन निश्चित रूप से वह पागल पागल था। उसे समझाने की कोशिश करते हुए (एक सीधे चेहरे के साथ - जो चुनौतीपूर्ण था) कि दुभाषिया या संकलक एक-निर्देश-निर्देश-प्रति-पंक्ति कथनों को अलग करने वाली उस लंबी रेखा को कैसे तोड़ देगा - अनिवार्य रूप से परिणाम के समान है यदि वह आगे बढ़ गया था और संकलक को आउट-चालाक करने की कोशिश के बजाय कोड को केवल पठनीय बनाया गया - जिसका उस पर कोई प्रभाव नहीं पड़ा। लेकिन मैं पीछे हटा।
जब आप तीन और अपवाद प्रकार, एक या दो महीने जोड़ते हैं, तो यह कितना कम पठनीय होता है? (उत्तर: यह बहुत कम पठनीय होता है)।
प्रमुख बिंदुओं में से एक, वास्तव में, यह है कि टेक्स्टुअल सोर्स कोड को फॉर्मेट करने के अधिकांश बिंदु जो हम सभी हर दिन देख रहे हैं, वह वास्तव में अन्य मनुष्यों के लिए स्पष्ट है, कोड चलने पर वास्तव में क्या हो रहा है। क्योंकि कंपाइलर स्रोत कोड को पूरी तरह से अलग बनाता है और आपके कोड स्वरूपण शैली के बारे में कम परवाह नहीं कर सकता है। तो सभी पर एक लाइन पूरी तरह से बेकार है, भी।
बस केह रहा हू...
// super sucks...
catch( Exception ex )
{
if ( ex is FormatException || ex is OverflowException || ex is ArgumentNullException )
{
// write to a log, whatever...
return;
}
throw;
}