ऐसी परिस्थितियां हैं जहां आप उनका उपयोग कर सकते हैं, लेकिन वे बहुत ही अनियंत्रित होना चाहिए। स्थिति जहाँ मैं एक का उपयोग कर सकता हूँ शामिल हैं:
अपवाद लॉगिंग; संदर्भ के आधार पर आप इसके बजाय पोस्ट किए गए एक अपवाद या संदेश को चाहते हो सकते हैं।
लूपिंग तकनीकी परिस्थितियाँ, जैसे कि रेंडरिंग या साउंड प्रोसेसिंग या एक लिस्टबॉक्स कॉलबैक, जहाँ व्यवहार स्वयं समस्या को प्रदर्शित करेगा, एक अपवाद को फेंकना बस रास्ते में मिलेगा, और अपवाद को लॉग करना शायद 1000 के "XXX में विफल" संदेशों का परिणाम होगा ।
ऐसे कार्यक्रम जो विफल नहीं हो सकते, हालांकि उन्हें अभी भी कम से कम कुछ लॉग करना चाहिए।
अधिकांश winforms अनुप्रयोगों के लिए, मैंने पाया है कि यह प्रत्येक उपयोगकर्ता इनपुट के लिए एक सिंगल स्टेटमेंट स्टेटमेंट के लिए पर्याप्त है। मैं निम्नलिखित विधियों का उपयोग करता हूं: (AlertBox सिर्फ एक त्वरित MessageBox.Show आवरण है)
public static bool TryAction(Action pAction)
{
try { pAction(); return true; }
catch (Exception exception)
{
LogException(exception);
return false;
}
}
public static bool TryActionQuietly(Action pAction)
{
try { pAction(); return true; }
catch(Exception exception)
{
LogExceptionQuietly(exception);
return false;
}
}
public static void LogException(Exception pException)
{
try
{
AlertBox(pException, true);
LogExceptionQuietly(pException);
}
catch { }
}
public static void LogExceptionQuietly(Exception pException)
{
try { Debug.WriteLine("Exception: {0}", pException.Message); } catch { }
}
फिर हर ईवेंट हैंडलर कुछ ऐसा कर सकता है:
private void mCloseToolStripMenuItem_Click(object pSender, EventArgs pEventArgs)
{
EditorDefines.TryAction(Dispose);
}
या
private void MainForm_Paint(object pSender, PaintEventArgs pEventArgs)
{
EditorDefines.TryActionQuietly(() => Render(pEventArgs));
}
सैद्धांतिक रूप से, आप TryActionSilently हो सकते हैं, जो कॉल रेंडर करने के लिए बेहतर हो सकता है ताकि अपवाद संदेशों की अंतहीन मात्रा उत्पन्न न करें।