WPF implementation for exception handling

Creating a watcher

The watcher below is a self-managed watcher that takes care of exception handling in case of unhandled exceptions in both the AppDomain and Dispatcher.

public class ExceptionWatcher
{
    private static readonly ILog Log = LogManager.GetCurrentClassLogger();
 
    private readonly IExceptionService _exceptionService;
    private readonly IMessageService _messageService;
 
    public ExceptionWatcher(IExceptionService exceptionService, IMessageService messageService)
    {
        Argument.IsNotNull(() => exceptionService);
        Argument.IsNotNull(() => messageService);
 
        _exceptionService = exceptionService;
        _messageService = messageService;
 
        exceptionService.Register<Exception>(async exception =>
        {
            await _messageService.ShowAsync("An unknown exception occurred, please contact the developers");
        });
 
        var appDomain = AppDomain.CurrentDomain;
        appDomain.FirstChanceException += OnAppDomainFirstChanceException;
        appDomain.UnhandledException += OnAppDomainUnhandledException;
 
        var dispatcher = DispatcherHelper.CurrentDispatcher;
        if (dispatcher != null)
        {
            dispatcher.UnhandledException += OnDispatcherUnhandledException;
        }
    }
 
    private void OnAppDomainFirstChanceException(object sender, FirstChanceExceptionEventArgs e)
    {
        //var exception = e.Exception;
        //if (exception != null)
        //{
        //    _exceptionService.HandleException(exception);
        //}
    }
 
    private void OnAppDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        var exception = e.ExceptionObject as Exception;
        if (exception != null)
        {
            Log.Error(exception, "AppDomain.UnhandledException occurred");
 
            _exceptionService.HandleException(exception);
        }
    }
 
    private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        var exception = e.Exception;
        if (exception != null)
        {
            Log.Error(exception, "Dispatcher.UnhandledException occurred");
 
            if (_exceptionService.HandleException(exception))
            {
                e.Handled = true;
            }
        }
    }
}

Registering the exception watcher

In order for this exception handler to work, you need to register it so it stays alive in the application. Use the code below:

var serviceLocator = ServiceLocator.Default;
serviceLocator.RegisterTypeAndInstantiate<ExceptionWatcher>();

Contributions

We would like to thank the following contributors:

Want to contribute to the documentation? We have a guide for that!


Questions

Have a question about Catel? Use StackOverflow with the Catel tag!