2008-12-24 19 views
9

मैंने वीएस -2008 में एक नई WPF प्रोजेक्ट शुरू की और फिर DispatcherUnhandledException को जाल करने के लिए कुछ कोड जोड़ा। फिर मैंने Window1 पर एक फेंक अपवाद जोड़ा लेकिन त्रुटि हैडलर द्वारा फंस नहीं गई है। क्यूं कर?WPF - DispatcherUnhandledException काम नहीं कर रहा है

public App() 
    { 
     this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException); 

    } 

    void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 
    { 
     System.Windows.MessageBox.Show(string.Format("An error occured: {0}", e.Exception.Message), "Error"); 
     e.Handled = true; 
    } 

void Window1_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 

उत्तर

5

यह आपके द्वारा डिबगर हैंडलिंग अपवादों के तरीके के कारण हो सकता है - डीबग/अपवाद ... आपको यह कॉन्फ़िगर करने की अनुमति देनी चाहिए कि आप इसे कैसे प्रबंधित करना चाहते हैं।

1

रुचि

ऐसा लगता है कि अभी भी आईडीई अपवाद पर टूट रहा है उन लोगों के लिए और है कि अगर आप IDE में जारी रखने के लिए क्लिक करें यह त्रुटि हैंडलर कहते हैं।

2

सबसे पहले, डिबगिंग पर्यावरण के बाहर भी, मेरा हैंडलर ट्रिगर नहीं लग रहा है ..... तो मुझे एहसास हुआ कि मैं ई। हैंडल = सत्य सेट करना भूल गया।

सच में यह काम कर रहा था, लेकिन क्योंकि ई। हैंडल अभी भी झूठा था मानक अपवाद हैंडलर अभी भी लात मार चुका है और इसकी बात करता है।

एक बार जब मैंने ई। हैंडल = सत्य सेट किया, तो सबकुछ डरावना था। तो अगर यह आपके लिए काम नहीं कर रहा है, तो सुनिश्चित करें कि आपने वह कदम उठाया है। एक अपवाद या तो एक पृष्ठभूमि यूजर इंटरफेस (यूआई) धागा (अपने स्वयं के डिस्पैचर के साथ एक धागा) या एक पृष्ठभूमि कार्यकर्ता थ्रेड में प्रबंधित नहीं कर रहा है

3

MSDN लिंक http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx निम्नलिखित बाद में देखो यहाँ

प्रासंगिक है (एक डिस्पैचर के बिना थ्रेड), अपवाद को मुख्य यूआई थ्रेड पर अग्रेषित नहीं किया जाता है। नतीजतन, DispatcherUnhandledException उठाया नहीं है। इन परिस्थितियों में, आपको निम्न कार्य करने के लिए कोड लिखना होगा:

  1. पृष्ठभूमि धागे पर अपवादों को संभाल लें।
  2. मुख्य यूआई थ्रेड में उन अपवादों को प्रेषित करें।
  3. उन्हें डिस्पैटर UnhandledException उठाए जाने की अनुमति देने के लिए उन्हें संभालने के बिना मुख्य यूआई थ्रेड पर रेथ्रो करें।
+4

लिस्टिंग में कोड को छोड़कर मुख्य यूआई थ्रेड पर अपवाद फेंकता है। – svick

+0

डाउनग्रेड ... क्योंकि उदाहरण में अपवाद मुख्य धागे पर फेंक दिया गया है –

0

इस तरह मैं इसे संभालता हूं। यह सुंदर नहीं है लेकिन ध्यान रखें कि इस प्रकार की त्रुटि को इसे देव के रूप में कभी भी डिबगिंग नहीं करना चाहिए। उत्पादन में जाने से पहले उन त्रुटियों को लंबे समय से हल किया जाना चाहिए (इसलिए यह ठीक है कि यह सुंदर नहीं है)। स्टार्टअप प्रोजेक्ट में, App.xaml (App.xaml.cs) कोड में, मैंने निम्न कोड डाला।

  • OnStartup, हैंडलर में एक DispatcherUnhandledException ईवेंट हैंडलर
  • बनाते हैं, तो संदेश प्रदर्शित करने के लिए एक संदेशबॉक्स का उपयोग करें। ध्यान दें कि इसकी संभावना स्टार्टअप विंडो अभी तक नहीं बनाई गई है, इसलिए इसे विंडो में डालने का प्रयास न करें।
  • ई। त्रुटि
  • मुझे यह देखना पसंद है कि अतिरिक्त आंतरिक त्रुटियां कब होती हैं, इसलिए जब तक आंतरिक त्रुटि शून्य न हो तब तक मैं डिस्प्ले विंडो को कॉल करना जारी रखता हूं।

मुझे यकीन नहीं है कि कोड ब्लॉक विशेष वर्ण क्यों सही ढंग से स्वरूपित नहीं कर रहे हैं। उसके लिए माफ़ करना।

protected override void OnStartup(StartupEventArgs e) 
    { 
     // define application exception handler 
     Application.Current.DispatcherUnhandledException += 
      AppDispatcherUnhandledException; 

     // defer other startup processing to base class 
     base.OnStartup(e); 
    } 

    private void AppDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 
    { 
     runException(e.Exception); 

     e.Handled = true; 
    } 

    void runException(Exception ex) 
    { 
     MessageBox.Show(
      String.Format(
       "{0} Error: {1}\r\n\r\n{2}", 
       ex.Source, ex.Message, ex.StackTrace, 
       "Initialize Error", 
       MessageBoxButton.OK, 
       MessageBoxImage.Error)); 

     if (ex.InnerException != null) 
     { 
      runException(ex.InnerException); 
     } 
    } 
संबंधित मुद्दे