2011-02-03 12 views
5

हाय मैं वैश्विक अपवाद हैंडलिंग के लिए इस साइट से समाधान को लागू करने का प्रयास करता हूं।कैलिबर्न के साथ डब्ल्यूपीएफ ऐप में ग्लोबल हैंडलिंग अपवाद। माइक्रो

http://www.codeproject.com/Articles/90866/Unhandled-Exception-Handler-For-WPF-Applications.aspx

मैं MVVM ढांचे के रूप में Caliburn माइक्रो का उपयोग करें। सेवा मेरे पास बाहरी असेंबली में है और इसे एमईएफ के साथ मॉडल मॉडल में इंजेक्शन दिया गया है।

WPF ऐप में वैश्विक अपवाद हैंडलिंग के लिए मेरा कार्यान्वयन यहां है।

App.xaml

  DispatcherUnhandledException="Application_DispatcherUnhandledException" 
     Startup="Application_Startup" 

अनुप्रयोग वर्ग:

public partial class App : Application 
{ 
    private IMessageBox _msgBox = new MessageBoxes.MessageBoxes(); 

    public bool DoHandle { get; set; } 

    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
    } 

    private void Application_DispatcherUnhandledException(object sender, 
          System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) 
    { 
     if (DoHandle) 
     { 
      _msgBox.ShowException(e.Exception); 
      e.Handled = true; 
     } 
     else 
     { 
      _msgBox.ShowException(e.Exception); 
      e.Handled = false; 
     } 
    } 


    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     var ex = e.ExceptionObject as Exception; 
     _msgBox.ShowException(ex); 
    } 


} 

बाहरी विधानसभा से सेवा विधि:

public void ServiceLogOn() 
    { 
     try 
     { 

     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 
    } 

यह सेवा विधि बटन पर उदाहरण के लिए दृश्य मॉडल कक्षा में कॉल है घटना पर क्लिक करें:

[Export(typeof(ILogOnViewModel))] 
    public class LogOnViewModel : Screen, ILogOnViewModel 
    { 
     public void LogOn() 
     { 
      _service.ServiceLogOn(); 
     } 
    } 
  1. मैं विजुअल स्टूडियो में WPF ऐप चलाता हूं और ServiceLogOn विधि में संदेश "खराब प्रमाण-पत्र" के साथ अपवाद उत्पन्न करता हूं।

    मुझे उम्मीद है कि मैं अपवाद के साथ संदेश बॉक्स देखता हूं।

    लेकिन विजुअल स्टूडियो ऐप डीबग करना बंद कर देता है और सेवा प्रोजेक्ट में सेवा विधि में अपवाद दिखाता है।

  2. तो मैं exe फ़ाइल से WPF चलाने का प्रयास करता हूं और ServiceLogOn विधि में एक ही अपवाद उत्पन्न करता हूं।

    मैं इस त्रुटि मिलती है:

    अपवाद एक मंगलाचरण का लक्ष्य द्वारा फेंक दिया गया है।

दृश्य मॉडल वर्ग से कोई अपवाद तरीकों में से संभाला नहीं है:

  • Application_DispatcherUnhandledException
  • या CurrentDomain_UnhandledException।

ऐप क्लास में।

मैं क्या बुरा करता हूं?

साइमन फॉक्स के उत्तर के साथ संपादित किया गया।

मैं साइमन फॉक्स के एमईएफ बूटस्ट्रैपर सलाह में कार्यान्वित करने का प्रयास करता हूं, लेकिन मैं अभी भी कुछ गलत करता हूं। मैं bootstraper वर्ग में OnUnhandledException विधि के अपवाद के लिए हैंडल तर्क को स्थानांतरित करता हूं।

public class MefBootStrapper : Bootstrapper<IShellViewModel> 
    { 
//... 
    private IMessageBox _msgBox = new MessageBoxes.MessageBoxes(); 

    public bool DoHandle { get; set; } 

    protected override void OnUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) 
    { 
     if (DoHandle) 
     { 
      _msgBox.ShowException(e.Exception); 
      e.Handled = true; 
     } 
     else 
     { 
      _msgBox.ShowException(e.Exception); 
      e.Handled = false; 
     } 

    } 
//... 
    } 

मैं बटन पर दृश्य मॉडल से कुछ विधि बाँध और नया अपवाद फेंक:

यहाँ bootstraper वर्ग से मेरे कोड है। कुछ इस तरह:

public void LogOn() 
{ 
    throw new ArgumentException("Bad argument"); 
} 

लेकिन परिणाम सैम है, मैं दृश्य स्टूडियो से बाहर ऐप का परीक्षण और यह अपवाद मिलता है।

अपवाद के लक्ष्य से अपवाद फेंक दिया गया है।

+0

क्या अपवाद में एक आंतरिक अपवाद है, यदि ऐसा है तो क्या है? क्या आप अपवाद में शामिल स्टैकट्रेस पोस्ट कर सकते हैं? –

+0

हाय साइमन, आंतरिक अपवाद शून्य है, अगर मैं विजुअल स्टूडियो में चेक करता हूं, तो विधि ऑन कोड ऑनऑनहैंडेड एक्सेप्शन नोट को निष्पादित किया जाता है। –

+0

साइमन मैं सरल नमूना करता हूं, अगर आप चाहते हैं कि आप कोशिश कर सकते हैं। यहां यह है: http: //cid-042424ddb4d5fcbf.office.live.com/self.aspx/MSDN/MVVM%5E_and%5E_global%5E_exceptions%5E_handling.7z –

उत्तर

13

कैलिबर्न। माइक्रो ने अनचाहे अपवादों को जोड़ने के लिए समर्थन में बनाया है। बूटस्ट्रैपर क्लास (जो प्रत्येक कैलिबर्न प्रोजेक्ट की आवश्यकता है) इसे आपके लिए सेट करता है और virtualOnUnhandledException विधि प्रदान करता है।

अपने कस्टम BootStrapper में आपको अपने ऐप में अनचाहे अपवादों के लिए कोई कस्टम क्रिया करने के लिए overrideOnUnhandledException अवश्य होना चाहिए। ध्यान दें कि आपको यूआई थ्रेड में संदेश बॉक्स प्रदर्शित करने जैसे मार्शल क्रियाएं करना होगा (कैलिबर्न इसे Execute.OnUIThread के माध्यम से आसानी से सक्षम बनाता है)।

आपको अपनी सेवा क्लाइंट को अपवादों के तरीके में भी एक समस्या हो सकती है, लेकिन सेवा के कार्यान्वयन/होस्ट/आदि के बारे में कोई जानकारी के बिना मैं सहायता नहीं कर सकता। क्या आप एसओएपी करने के लिए डब्ल्यूसीएफ का उपयोग कर रहे हैं? क्या आप FaultContracts का उपयोग कर रहे हैं?

+0

हाय साइमन, मैं SOAP या REST का उपयोग नहीं कर रहा हूं वेब सेवाएं, यह केवल HTTP पोस्ट/जीईटी संचार है, कोई एसओएपी/जेएसओएन नहीं है। मैंने अपना प्रश्न संपादित किया, इसे देखें। –

+0

यह उत्तर सही है। हालांकि यह मेरे लिए काम नहीं करता है क्योंकि यूआई थ्रेड से अपवाद नहीं फेंक दिया गया था। मैं 'टास्क' का उपयोग कर रहा था इसलिए मैंने इस जवाब से [टास्क। कॉन्टिन्यू विथ] (http://stackoverflow.com/a/7297904/448232) के उपयोग का सुझाव दिया था। –

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