Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I set up .NET UnhandledException handling in a Windows service?

protected override void OnStart(string[] args) {     AppDomain.CurrentDomain.UnhandledException +=         new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);      Thread.Sleep(10000);      throw new Exception(); }  void CurrentDomain_UnhandledException(object sender,                                       UnhandledExceptionEventArgs e) { } 

I attached a debugger to the above code in my windows service, setting a breakpoint in CurrentDomain_UnhandledException, but it was never hit. The exception pops up saying that it is unhandled, and then the service stops. I even tried putting some code in the event handler, in case it was getting optimized away.

Is this not the proper way to set up unhandled exception handling in a windows service?

like image 334
Mike Pateras Avatar asked Mar 16 '10 17:03

Mike Pateras


People also ask

How to handle exceptions Globally in c#?

An ExceptionFilterAttribute is used to collect unhandled exceptions. You can register it as a global filter, and it will function as a global exception handler. Another option is to use a custom middleware designed to do nothing but catch unhandled exceptions.

How to handle unhandled exception in ASP net c#?

Use the Server object's GetLastError method to retrieve details of the unhandled exception that caused the Error event to fire. The GetLastError method returns an object of type Exception , which is the base type for all exceptions in the . NET Framework.

What happens if there is an unhandled exception?

If you don't have any means of catching or trapping exceptions then they become unhandled and will cause program failure. Major errors can occur if your code divides by zero or tries to reference a value that doesn't exist.


1 Answers

The reason that the UnhandledException event on the current AppDomain does not fire is how services are executed.

  1. User sends a Start command from the Windows Service Control Manager (SCM).
  2. The command is received by the framework's ServiceBase implementation and dispatched to the OnStart method.
  3. The OnStart method is called.

Any exception which is thrown by OnStart is handled in the base class, logged to the Event Log, and translated into an error status code returned to the SCM. So the exception never propagates to the AppDomain's unhandled exception handler.

I think you would find that an unhandled exception thrown from a worker thread in your service would be caught by the AppDomain's unhandled exception handler.

like image 80
Chris Dickson Avatar answered Oct 10 '22 10:10

Chris Dickson