¿Cómo registrar todas las excepciones lanzadas?

¿Cómo registrar las excepciones que fueron lanzadas y atrapadas? Algo así como el IntelliTrace de Visual Studio. ¿O hay una manera de integrar InteliTrace en la versión de depuración de la aplicación y luego ver sus registros?

Actualización: lo aclararé un poco. Quiero registros .txt estándar (o cualquier registro personalizado), el formato no importa. El punto principal es que quiero registrar todas las excepciones que ocurrieron en todas las bibliotecas de terceros sin agregarles código.

Supongo que la característica que está buscando se llama FirstChanceException y se puede acceder a través del evento AppDomain.FirstChanceException

Esencialmente, este evento proporciona un gancho para obtener información sobre cualquier excepción (administrada) que se genere en el AppDomain . ¡No puedes manejar la excepción de esta manera! Es solo un tipo de notificación


Actualización: con respecto a su comentario sobre una “excepción tragada” en otra respuesta, y solo un tiro en la oscuridad:
En sistemas x64, las excepciones que se lanzan en el método de Windows ‘onLoad no se pueden capturar en su método Main ().
vea este artículo SO para referencia


Actualización 2: En cuanto a los Threads , creo que tendrías que implementarlo tú mismo. Esto implicaría algún tipo de encuesta y dañaría el rendimiento, pero supongo que para la depuración está bien en la mayoría de los casos. Esto podría hacerse usando

 var threads = Process.GetCurrentProcess().Threads; 

Puedes ir con aspectos. Si, por ejemplo, toma PostSharp y escribe un aspecto que crea un try-catch para cada función, el registro se realiza en el aspecto. Después de iniciar sesión, solo vuelva a lanzarlo.

Código de ejemplo de su sitio web para tener una respuesta completa con código de demostración:

 ///  /// Aspect that, when applied on a method, catches all its exceptions, /// assign them a GUID, log them, and replace them by an . ///  [Serializable] public class ExceptionPolicyAttribute : OnExceptionAspect { ///  /// Method invoked upon failure of the method to which the current /// aspect is applied. ///  /// Information about the method being executed. 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)); } } 

Editar:

Puede usar cualquier registrador como log4net, NLog o la biblioteca empresarial (mi forma preferida de hacer logging y algunas otras cosas). Pero esa no es realmente la tarea aquí. La tarea es, en mi humilde opinión, inyectar el registro en el proyecto con la menor encoding manual posible.

Para las excepciones manejadas lo más probable es que necesite iniciar sesión de forma explícita. Incluso si ese no es el caso semánticamente, hay una gran diferencia en las excepciones manejadas y no controladas.

Las excepciones manejadas ya no son una situación excepcional. Alguien que escribe el código dijo. Sé cómo manejar esta excepción y luego procedo correctamente.

Para excepciones no manejadas, eche un vistazo a Elmah

Podría adjuntar un depurador, como WinDbg, a su proceso, y conseguir que rompa en cualquier primera oportunidad de excepciones CLR; esto incluirá excepciones en la biblioteca de terceros. Vea aquí un ejemplo de cómo hacer esto.

Puede usar su propio sistema de registro o usar una lib de terceros llamada log4net.

intente utilizar Log4Net: es un gran registrador y utiliza mucho en estos escenarios http://sourceforge.net/projects/log4net/

Si lo tuyo es un elemento web, entonces puedes usar https://elmah.github.io/ para registrar automáticamente los errores (¡sin siquiera detener tu servicio!)

Alternativamente a Log4Net propuesto por algunos tipos, también puedes usar NLog . No sé las diferencias entre las dos soluciones, solo sé que estoy contento con NLog.