जैसा कि इस प्रश्न को "सी #" टैग किया गया है, हम इन प्रकार के सवालों के जवाब देने के लिए .NET Framework Design दिशानिर्देशों को एक अच्छे प्रारंभिक बिंदु के रूप में देख सकते हैं। यह एमएसडीएन पर "Exception Throwing" के तहत दिया गया मार्गदर्शन है:
यदि संभव हो तो नियंत्रण के सामान्य प्रवाह के लिए अपवादों का उपयोग न करें। अलावा सिस्टम विफलताओं और संभावित दौड़ की स्थिति के साथ संचालन के लिए, ढांचे डिजाइनरों एपीआई डिजाइन, ताकि उपयोगकर्ताओं को कोड कि अपवाद फेंक नहीं है लिख सकते हैं चाहिए। उदाहरण के लिए, आप सदस्य को कॉल करने से पहले पूर्व शर्त जांच सकते हैं ताकि उपयोगकर्ता कोड लिख सकें जो अपवाद नहीं फेंकता है।
यहाँ एक बुरा अभ्यास जहां एक अपवाद नियंत्रित किया जाता है, लेकिन लगभग हमेशा से बचा जा सकता का एक उदाहरण है:
public int? GetItem(int index)
{
int? value = null;
try
{
value = this.array[index];
}
catch (IndexOutOfRangeException)
{
}
return value;
}
यह काल्पनिक लगता है, लेकिन मैं नए प्रोग्रामर से अक्सर इस तरह कोड देखें। array
पर पढ़ने और लिखने के आसपास उचित सिंक्रनाइज़ेशन मानते हुए, यह अपवाद 100% निश्चित रूप से टाला जा सकता है। यह देखते हुए कि, एक बेहतर तरीका है कि कोड लिखने के लिए निम्न होगा:
public int? GetItem(int index)
{
int? value = null;
// Ensure the index is within range in the first place!
if (index >= 0 && index < this.array.Length)
{
value = this.array[index];
}
return value;
}
अन्य मामलों जहां यथोचित अपवाद से बचने नहीं कर सकते हैं और उन्हें संभाल करने की आवश्यकता है। यह आमतौर पर तब सामना किया जाता है जब आपको बाहरी संसाधनों जैसे कि फाइल या नेटवर्क कनेक्शन से निपटना होता है, जिन्हें आप किसी भी समय पहुंच या संपर्क में संभावित रूप से खो सकते हैं। WCF से उदाहरण:
public void Close()
{
// Attempt to avoid exception by doing initial state check
if (this.channel.State == CommunicationState.Opened)
{
try
{
// Now we must do a (potentially) remote call;
// this could always throw.
this.channel.Close();
}
catch (CommunicationException)
{
}
catch (TimeoutException)
{
}
}
// If Close failed, we might need to do final cleanup here.
if (this.channel.State == CommunicationState.Faulted)
{
// local cleanup -- never throws (aside from catastrophic situations)
this.channel.Abort();
}
}
यहां तक कि ऊपर के उदाहरण में, यह आपरेशन आप क्या करने जा रहे कम से कम एक मौका सफल होने की है कि जाँच करने के लिए अच्छा है। तो अभी भी एक if()
चेक है, उसके बाद उचित अपवाद हैंडलिंग तर्क के बाद।
'साक्षात्कारकर्ता को कुछ अन्य उत्तर की उम्मीद लग रही थी' - तो आपने उससे क्यों नहीं पूछा? साक्षात्कार के दौरान मैं एक प्रश्न के मुकाबले एक प्रश्न से अधिक प्रभावित हूं ... –