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.
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;
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With