How to log all thrown exceptions?

前端 未结 8 2040
一个人的身影
一个人的身影 2020-11-29 07:55

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 app

相关标签:
8条回答
  • 2020-11-29 08:43

    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;
    
    0 讨论(0)
  • 2020-11-29 08:44

    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.

    0 讨论(0)
  • 2020-11-29 08:46

    Alternatively to Log4Net proposed by some guys, you could also use NLog. I don't know the differences between the two solutions, I just know that I'm happy with NLog.

    0 讨论(0)
  • 2020-11-29 08:53

    For handled exceptions you'd most likely need to log them explicitly. Even if that's not the case semantically there's a huge difference to handled and unhandled exceptions.

    Handled exceptions are no longer an exceptional situation. Some one writing the code said. I know how to handle this exception and proceed correctly afterwards.

    For unhandled exceptions have a look at Elmah

    0 讨论(0)
  • 2020-11-29 08:54

    If your thing is a web thing then you can use https://elmah.github.io/ to automatically log errors (without even stopping your service!)

    0 讨论(0)
  • 2020-11-29 08:59

    try using Log4Net - its a great logger and used a lot in these scenarios http://sourceforge.net/projects/log4net/

    0 讨论(0)
提交回复
热议问题