2011-02-03 15 views
5

Witam Próbuję zaimplementować rozwiązanie z tej strony w mojej aplikacji WPF do globalnej obsługi wyjątków.Globalny wyjątek obsługi w aplikacji WPF z Caliburn.Micro

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

używam Caliburn Micro jako MVVM ram. Usługa mam w zewnętrznym montażu i jest wstrzykiwana w widoku modelu klasy z MEF.

Oto moje wdrożenie do globalnej obsługi wyjątków w aplikacji WPF.

klasa App.xaml

  DispatcherUnhandledException="Application_DispatcherUnhandledException" 
     Startup="Application_Startup" 

App:

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); 
    } 


} 

metoda Service z montażu zewnętrznego:

public void ServiceLogOn() 
    { 
     try 
     { 

     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 
    } 

Metoda ta usługa jest wywołanie w klasie widok modelu na przykład na przycisku kliknij wydarzenie:

[Export(typeof(ILogOnViewModel))] 
    public class LogOnViewModel : Screen, ILogOnViewModel 
    { 
     public void LogOn() 
     { 
      _service.ServiceLogOn(); 
     } 
    } 
  1. uruchomić aplikację WPF w Visual Studio i produkują wyjątek z komunikatem "Bad mandatów" w metodzie ServiceLogOn.

    Oczekuję, że zobaczę okno komunikatu z wyjątkiem.

    Ale program Visual Studio zatrzymuje aplikację do debugowania i pokazuje wyjątek w metodzie usługi w projekcie usługi.

  2. Więc próbuję uruchomić WPF z pliku exe i wyprodukować ten sam wyjątek w metodzie ServiceLogOn.

    otrzymuję ten błąd:

    wyjątku został rzut za cel inwokacji.

Każdy wyjątek z klasy Widok modelu nie są przetwarzane metodami:

  • Application_DispatcherUnhandledException
  • lub CurrentDomain_UnhandledException.

w klasie aplikacji.

Co robię źle?

EDYCJA z odpowiedzią Simona Foxa.

Próbuję zaimplementować porady dotyczące bootstragera MEF Simona Foxa, ale wciąż coś nie tak. Przenoszę logikę obsługi dla wyjątku do metody OnUnhandledException w klasie bootstraper.

Oto mój kod z klasy bootstraper:

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; 
     } 

    } 
//... 
    } 

wiążę niektóre metody z widoku modelu na przycisku i wrzucić nowy wyjątek. Coś takiego:

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

Ale wynik jest sam, testuję aplikację z Visual Studio i otrzymuję ten wyjątek.

Wyjątek został rzucony do celu wywołania.

+0

Czy wyjątek ma wyjątek InnerException, jeśli tak, co to jest? Czy możesz opublikować StackTrace zawarte w wyjątku? –

+0

Cześć Simon, Wewnętrzny wyjątek jest pusty, jeśli sprawdzę w Visual Studio, kod w metodzie OnUnhandledException jest wykonywany jako notatka. –

+0

Simon Wykonuję prostą próbkę, jeśli chcesz możesz spróbować. Oto ona: http: //cid-042424ddb4d5fcbf.office.live.com/self.aspx/MSDN/MVVM%5E_and%5E_global%5E_exceptions%5E_handling.7z –

Odpowiedz

13

Caliburn.Micro ma wbudowaną obsługę zahaczania nieobsługiwanych wyjątków. Klasa Bootstrapper (wymagana w ramach każdego projektu Caliburn) ustawia ją dla Ciebie i dostarcza metody .

W niestandardowej BootStrapper musisz wykonać overrideOnUnhandledException, aby wykonać dowolne niestandardowe akcje dla nieobsługiwanych wyjątków w aplikacji. Zauważ, że najprawdopodobniej będziesz musiał wykonać akcje marszałkowskie, takie jak wyświetlenie okna komunikatu do wątku interfejsu użytkownika (Caliburn włącza to łatwo poprzez Execute.OnUIThread).

Możesz również mieć problem ze sposobem, w jaki Twoja usługa przenosi wyjątki do klienta, ale bez żadnych szczegółów dotyczących sposobu wdrożenia/hostowania usługi/etc. Nie mogę pomóc. Czy używasz WCF do robienia SOAP? Czy używasz FaultContracts?

+0

Cześć Simon, nie używam SOAP ani REST Web Services, to tylko komunikacja HTTP POST/GET, brak SOAP/JSON. Zmontowałem moje pytanie, zobacz to. –

+0

Ta odpowiedź jest właściwa. Nie zadziałało to jednak dla mnie, ponieważ wyjątek nie został zgłoszony z wątku interfejsu użytkownika. Używałem 'Task's, więc wywnioskowałem z tej odpowiedzi sugerując użycie [Task.ContinueWith] (http://stackoverflow.com/a/7297904/448232) –

Powiązane problemy