Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AppDomain.CurrentDomain.UnhandledException does not get called

I have a WCF service that has the following code in Global.asax:

protected void Application_Start(object sender, EventArgs e)
{
    // Make sure that any exceptions that we don't handle at least get logged.
    AppDomain.CurrentDomain.UnhandledException += LogUnhandledException;
}

private void LogUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    Log.Error.LogException("UnhandledException", e.ExceptionObject as Exception);
}

The idea is to at least log all exceptions that are unhanded.

But it does not seem to ever be called. I tried doing a Divide by Zero in one of my service operations and it just stops the service after it hits the exception.

int zero = 0;
int result = 100 / zero;

The LogUnhandledException method never gets called.

I have tried this in both IIS and running in the debugger.

How can I get this event to work for a WCF service?

like image 821
Vaccano Avatar asked May 02 '13 22:05

Vaccano


2 Answers

The unhandled exception filter for an app domain is a last-ditch attempt to allow the application to log meaningful information before it is terminated.

This event provides notification of uncaught exceptions. It allows the application to log information about the exception before the system default handler reports the exception to the user and terminates the application.

If WCF allowed an exception thrown by a service to be completely unhandled in this way it would mean that when the service is hosted in IIS the entire worker process would be terminated because a single request raised an exception - not a desirable outcome. As a result WCF doesn't leave exceptions thrown by services unhandled - this event will not be raised in this case.

If you want to log exceptions thrown by WCF services then take a look at the IErrorHandler interface instead.

like image 90
Justin Avatar answered Sep 22 '22 16:09

Justin


Try also catching a ThreadException, e.g.

        Application.ThreadException += Application_ThreadException;
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

I had the same issue in the WinForms app a while ago. UnhandledException is raised for truly unhandled exceptions that would normally terminate your entire process immediately. Typically there's a global handler that doesn't let that happen, and provides some default behavior. So you need to catch the exception before it goes to that handler. This can be done via a ThreadException.

like image 29
Alex Avatar answered Sep 22 '22 16:09

Alex