Soy nuevo en el desarrollo de software y también nuevo en stackoverflow, así que no me moleste.Excepciones no controladas en la biblioteca de clases C# para fines de registro
ANTECEDENTES: Estoy desarrollando una biblioteca de clases C# que procesa mensajes xml enviados por una aplicación de terceros a través de tcp/ip (usando sockets Async). Estoy usando com-interop para exponer la biblioteca de clase a una aplicación Vb6. Cuando la biblioteca C# procesa el xml que recibe sobre el socket, plantea varios eventos a los que se suscribe la aplicación vb6 consumidora (de esta forma, cuando finalmente reescribamos toda la aplicación en .Net ya habremos terminado con este componente).
PREGUNTA: Quiero ver todas las excepciones no controladas para FINES DE INSCRIPCIÓN ÚNICAMENTE. En una aplicación de winforms puede conectar un evento a AppDomain.CurrentDomain.UnhandledException y a Application.ThreadException. ¿No hay forma de obtener de manera similar los datos de excepción para registrar la información en una biblioteca de clases?
puntos importantes:
No estoy tratando de recuperarse de estas excepciones, pero sólo les registrar y dejar que la excepción propagar y bloquee la aplicación si es necesario.
Estoy haciendo todo lo posible para detectar todas las excepciones específicas localmente donde sepa que pueden ocurrir. Por lo tanto, mi propósito es simplemente registrar las excepciones verdaderamente inesperadas.
- Sé que algunos dirán que este sería un mal patrón de diseño. Debo, en cambio, dejar que la persona que llama lidie con estas excepciones. El problema es que la aplicación vb6 no tiene un manejo de errores tan sólido como me gustaría. En primer lugar, quiero registrar el seguimiento de la pila para que si la aplicación vb6 se cuelga debido a mi dll, pueda ver el registro para recibir una alerta sobre las áreas potenciales de mi código C# que podrían necesitar modificaciones.
¿Alguien me puede dar alguna dirección? La mejor opción que he encontrado hasta ahora parece poner un bloque try try genérico en cada método público, registrar la excepción y luego lanzarla. Esto parece ser menos que ideal:
public void SomeMethod()
{
try
{
// try something here...
}
catch (Exception ex)
{
Log(ex);
throw;
}
}
Esto no sólo parece esto como un mal diseño, pero, además, no sé qué pasaría si una de las devoluciones de llamada asincrónicas provoca una excepción en un subproceso diferente que el método se llama en. ¿Este bloque general try/catch aún captaría tal excepción?
Gracias por cualquier ayuda.
EDIT: I, originalmente de la respuesta de @Eric J. como correcta, pero después de tratar de poner en práctica la solución que he encontrado que no va a funcionar bien con las devoluciones de llamada asincrónicos de la clase socket que estoy usando . Una vez que un subproceso de subprocesos se utiliza para desencadenar la devolución de llamada asincrónica, parece que no puedo detectar ninguna excepción que ocurra más adelante en la pila. ¿Necesitaré usar un marco AOP o hay alguna otra forma de detectar estas excepciones?
El verdadero problema aquí era que no tenía un bloque de catch de nivel superior en mis funciones de devolución de llamada asíncronas. Dado que se ejecutan en subprocesos separados (subprocesos de grupo de subprocesos), sus excepciones no vuelven a aparecer en ningún otro lugar. AOP parece una buena solución para este escenario para evitar tantos bloques catch de alto nivel. Es algo en lo que pretendo invertir un poco de tiempo un poco más adelante. –