c# - tipos - ¿Cómo registrar todas las excepciones lanzadas?
qué aspectos se deben evitar al producir excepciones (8)
Alternativamente a Log4Net propuesto por algunos chicos, también podría usar NLog . No sé las diferencias entre las dos soluciones, solo sé que estoy contento con NLog.
¿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 otro 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.
Para las excepciones manejadas, lo más probable es que tenga que registrarlas explícitamente. Incluso si ese no es el caso semánticamente, hay una gran diferencia entre las excepciones manejadas y no manejadas.
Las excepciones manejadas ya no son una situación excepcional. Alguien que escribía el código decía. Sé cómo manejar esta excepción y proceder correctamente después.
Para excepciones no manejadas echar un vistazo a Elmah
Podrías ir con los 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 simplemente vuelve a lanzarlo.
Código de ejemplo de su sitio web para tener una respuesta completa con el código de demostración:
/// <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));
}
}
Editar:
Podría usar cualquier registrador como log4net, NLog o la biblioteca de la empresa (mi forma preferida de hacer el registro y algunas otras cosas). Pero esa no es realmente la tarea aquí. La tarea es - IMHO - inyectar el inicio de sesión en el proyecto con la menor cantidad de codificación manual posible.
Puede adjuntar un depurador, como WinDbg, a su proceso, y hacer que se rompa en cualquier excepción CLR de primera oportunidad; esto incluirá excepciones en la biblioteca de terceros. Vea here un ejemplo de cómo hacer esto.
Puede usar su propio sistema de registro o usar una biblioteca de terceros llamada log4net.
Si lo tuyo es web, puedes usar https://elmah.github.io/ para registrar errores automáticamente (¡sin siquiera detener tu servicio!)
intente usar Log4Net: es un excelente registrador y se usa mucho en estos escenarios http://sourceforge.net/projects/log4net/
Supongo que la característica que está buscando se llama FirstChanceException
y se puede acceder a ella a través del evento AppDomain.FirstChanceException
Esencialmente, este evento proporciona un enlace para obtener información sobre cualquier excepción (administrada) que se lance en el AppDomain
. ¡No puedes manejar la excepción de esta manera! Es solo una especie 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 los sistemas x64, las excepciones que se lanzan en un método onLoad de Windows no se pueden capturar en su método Main ().
ver 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 sondeo y dañaría el rendimiento, pero supongo que para la depuración está bien en la mayoría de los casos. Esto se podría hacer usando
var threads = Process.GetCurrentProcess().Threads;