Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to log all thrown exceptions?

How to log any exceptions that were thrown and catched? Something like Visual Studio's IntelliTrace do. Or is there a way to integrate InteliTrace into debug version of application and then view its logs?

Update: I'll clarify that a bit. I want standard .txt (or any custom) logs, the format doesn't matter. The main point is I want to log all exceptions that occurred in all third-party libraries without adding code to them.

like image 978
Poma Avatar asked Aug 16 '11 09:08

Poma


2 Answers

I guess the feature you are searching for is called FirstChanceException and can be accessed via the AppDomain.FirstChanceException Event

Essentially this event provides a hook to get information about any (managed) exception getting thrown in the AppDomain. You can not handle the Exception this way! It is only a sort of notification


Update: regarding your comment about a "swallowed exception" on another answer - and just a shot into the dark:
On x64 systems exceptions that get thrown in a windows' onLoad method can not be caught in your Main() method.
see this SO article for reference


Update 2: As for Threads I think that you would have to implement it yourself. This would involve some sort of polling and would harm performance, but I guess for debugging it is OK in most cases. This could be done using

var threads = Process.GetCurrentProcess().Threads; 
like image 191
yas4891 Avatar answered Sep 21 '22 11:09

yas4891


You might go with aspects. If for example you take PostSharp, and write an aspect that creates a try-catch for every function, logging is done in the aspect. After logging just rethrow it.

Example code from their website to have a complete answer with demo code:

/// <summary> /// Aspect that, when applied on a method, catches all its exceptions, /// assign them a GUID, log them, and replace them by an <see cref="InternalException"/>. /// </summary> [Serializable] public class ExceptionPolicyAttribute : OnExceptionAspect {     /// <summary>     /// Method invoked upon failure of the method to which the current     /// aspect is applied.     /// </summary>     /// <param name="args">Information about the method being executed.</param>     public override void OnException(MethodExecutionArgs args)     {         Guid guid = Guid.NewGuid();          Trace.TraceError("Exception {0} handled by ExceptionPolicyAttribute: {1}",             guid, args.Exception.ToString());          throw new InternalException(             string.Format("An internal exception has occurred. Use the id {0} " +                 "for further reference to this issue.", guid));     } } 

Edit:

You could use any logger like log4net, NLog or the enterprise library ( my preferred way of doing logging and some other stuff ). But that isn't really the task here. The task is - IMHO - to inject logging into the project with as less manual coding as possible.

like image 43
Sascha Avatar answered Sep 21 '22 11:09

Sascha