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();
}
}
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.
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.
Czy wyjątek ma wyjątek InnerException, jeśli tak, co to jest? Czy możesz opublikować StackTrace zawarte w wyjątku? –
Cześć Simon, Wewnętrzny wyjątek jest pusty, jeśli sprawdzę w Visual Studio, kod w metodzie OnUnhandledException jest wykonywany jako notatka. –
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 –