2011-06-09 19 views
24

क्या कोड में कहीं भी फेंकने वाले एक्सपेक्शन को पकड़ने के लिए वैसे भी है? मैं अपवादों को पकड़ना चाहता हूं और प्रत्येक कार्यक्षमता के लिए प्रयास ब्लॉक को लिखने के बजाय उन्हें समान तरीके से संभालना चाहता हूं।विंडोज़ फॉर्म में अनुप्रयोग अपवादों को पकड़ें

+1

यह ऐसा कुछ नहीं है जिसे आप स्थानीय रूप से संभालने के बजाय करना चाहते हैं लेकिन जोड़ में। जवाब दे सकते हैं। – Jodrell

उत्तर

35

Windows अनुप्रयोग फॉर्म्स में, जब एक अपवाद (अतुल्यकालिक कॉल मुख्य थ्रेड पर या के दौरान) आवेदन में कहीं भी फेंक दिया जाता है की सदस्यता ले सकते हैं, तो आप उस पर ThreadException घटना के लिए पंजीकरण करके पकड़ कर सकते हैं आवेदन। इस तरह आप सभी अपवादों को उसी तरह से इलाज कर सकते हैं।

Application.ThreadException += new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod) 

private static void MyCommonExceptionHandlingMethod(object sender, ThreadExceptionEventArgs t) 
{ 
    //Exception handling... 
} 
+3

बस अगर यह किसी की मदद कर सकता है। एप्लिकेशन (एप्लिकेशन.रुन (...);) चलाने से पहले कृपया ईवेंट हैंडलर (Application.ThreadException + = ...) पर पंजीकरण करना सुनिश्चित करें। अन्यथा, यह काम नहीं करेगा (जैसा कि यह मेरे साथ हुआ) –

+0

यह सवाल का जवाब देता है, लेकिन ब्रायन डिशॉ का लिंक उनके उत्तर में बहुत व्यापक है, और इसमें सभी (अगर अधिकतर नहीं) कवर किए गए मामलों का उपयोग करते हैं।एकमात्र चीज जो उत्पादन एप में उपयोगी नहीं है, वह त्रुटि संदेश के साथ संवाद लौटने की विधि होगी। एक वास्तविक उत्पादन ऐप आपके एप्लिकेशन में एक संवाद पॉप अप करने के बजाय इवेंट लॉग को भेजेगा। – MacGyver

15

स्पष्ट उत्तर आपके निष्पादन श्रृंखला के शीर्ष पर एक अपवाद हैंडलर रखना है।

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    try 
    { 
     Application.Run(new YourTopLevelForm()); 
    } 
    catch 
    { 
     //Some last resort handler unware of the context of the actual exception 
    } 
} 

यह आपके मुख्य जीयूआई थ्रेड पर होने वाले किसी भी अपवाद को पकड़ लेगा। यदि आप सभी धागे पर होने वाले अपवादों को वैश्विक रूप से पकड़ना चाहते हैं तो आप AppDomain.UnhandledException ईवेंट की सदस्यता ले सकते हैं और वहां संभाल सकते हैं।

Application.ThreadException += 
    new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod) 
private static void MyCommonExceptionHandlingMethod(
               object sender, 
               ThreadExceptionEventArgs t) 
{ 
    //Exception handling... 
} 

कोड से Charith J's answer

अब सलाह के लिए पर

की नकल की ...

ये विकल्प केवल एक अंतिम उपाय के रूप में, कहते हैं इस्तेमाल किया जाना चाहिए, अगर आप गलती से ध्यान में न आया अपवादों को दबाने के लिए चाहते हैं प्रस्तुति से उपयोगकर्ता तक। जब भी आप अपवाद के संदर्भ के बारे में कुछ जानते हैं, तो आपको जल्द से जल्द पकड़ना चाहिए। इससे भी बेहतर, आप समस्या के बारे में कुछ करने में सक्षम हो सकते हैं।

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

क्षमा करें यदि आप पहले से ही जानते हैं और ऐसा करते हैं।

+3

@ डाउनवॉटर, किसी भी आलोचनात्मक कृतज्ञतापूर्वक प्राप्त किया गया, मैं यहां सीखने के लिए हूं। – Jodrell

+0

यह मेरे लिए अच्छा लगता है। मुझे मतदान के लिए कोई कारण नहीं दिख रहा है ... – CharithJ

4

AppDomain.UnhandledException और Application.ThreadException देखें।

21

मुझे लगता है कि यह एक करीबी है क्योंकि आप जीत फॉर्म आवेदन के भीतर जो खोज रहे हैं उसे प्राप्त कर सकते हैं।

http://msdn.microsoft.com/en-us/library/ms157905.aspx

// Add the event handler for handling UI thread exceptions to the event. 
Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException); 

// Set the unhandled exception mode to force all Windows Forms errors to go through 
// our handler. 
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

// Add the event handler for handling non-UI thread exceptions to the event. 
AppDomain.CurrentDomain.UnhandledException += 
    new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

इन चरणों का आप कुछ अपवाद होने के जोखिम को चलाने के सब करने के बिना बिना क्रिया मिलता है।

+0

यह मेरा मुख्य पाश है (मेरा ऐप छुपा हुआ है, स्टेटसबार आइकन के साथ)। आपके कोड के साथ, मुझे अभी भी 'नया फॉर्म 1(); एप्लिकेशन.रुन();' कोशिश/पकड़ के अंदर लपेटने की जरूरत है ... – doekman

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