आपके स्निपेट में कैच क्लॉज कभी भी आपके ऐप के शिपिंग संस्करण में कुछ भी नहीं पकड़ पाएगा। यह काम करता है जब आप इसे डीबगर संलग्न करते हैं।
जो आप खो रहे हैं वह तरीका है। थ्रेडएक्सप्शन व्यवहार करता है। जब भी कोई अनचाहे अपवाद पता चला है तो वह घटना आग लगती है। हालांकि यह सुविधा सक्षम नहीं है जब आप अपना कोड डीबग करते हैं। घटना को बढ़ाने के लिए कोई अपवाद हैंडलर स्थापित नहीं है। ऐसा इसलिए किया गया था ताकि आपके पास अनचाहे अपवादों को डीबग करने का एक अच्छा तरीका हो। आपका कोड उस व्यवहार को बदलता है, अब एक सक्रिय ब्लॉक सक्रिय है, तो आपके कैच हैंडलर को अपवाद मिलता है।
कोड को उसी तरह से व्यवहार करने के लिए, आपको अनचाहे अपवाद हैंडलिंग रणनीति को बदलने की आवश्यकता होगी। इस तरह:
[STAThread]
static void Main() {
try {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
Application.Run(new Form1());
}
catch (Exception ex) {
// etc..
}
}
अब आपका पकड़ खंड हमेशा अपवाद को पकड़ लेगा। जब तक यह मुख्य धागे पर उठाया जाता है, तब तक यह कार्यकर्ता धागे में उठाए गए अपवादों को नहीं पकड़ पाएगा। एकीकृत से निपटने के लिए के बजाय इस कोड पर विचार करें:
[STAThread]
static void Main() {
AppDomain.CurrentDomain.UnhandledException += AllUnhandledExceptions;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
Application.Run(new Form1());
}
private static void AllUnhandledExceptions(object sender, UnhandledExceptionEventArgs e) {
var ex = (Exception)e.ExceptionObject;
// Display or log ex.ToString()
//...
Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex));
}
स्रोत
2012-08-25 19:28:33
आपकी महान सलाह के लिए धन्यवाद – armin
क्या यह डब्ल्यूपीएफ या सिर्फ विंडोज फॉर्म में काम करता है? –