Identificación del tipo de excepción en un bloque de captura del controlador

Identificación del tipo de excepción en un bloque de captura del controlador

Cuando trato con situaciones en las que no sé exactamente qué tipo de excepción puede surgir de un método, un pequeño "truco" que me gusta hacer es recuperar el nombre de clase de la Excepción y agregarlo al registro de errores para que haya más información. .

try
{
   <code>

} catch ( Exception caughtEx )
{
   throw new Exception("Unknown Exception Thrown: "
                       + "\n  Type:    " + caughtEx.GetType().Name
                       + "\n  Message: " + caughtEx.Message);
}

Respondo por manejar siempre los tipos de Excepciones individualmente, pero la información adicional puede ser útil, especialmente cuando se trata de código de personas a las que les encanta capturar tipos genéricos generales.


ACTUALIZADO:asumiendo C# 6, lo más probable es que su caso se pueda expresar como un filtro de excepción. Este es el enfoque ideal desde una perspectiva de rendimiento, suponiendo que su requisito se pueda expresar en términos de este, por ejemplo:

try
{
}
catch ( Web2PDFException ex ) when ( ex.Code == 52 )
{
}

Suponiendo que C# <6, lo más eficiente es capturar un Exception específico escriba y haga el manejo basado en eso. Cualquier manejo general se puede hacer por separado

try
{
}
catch ( Web2PDFException ex )
{
}

o

try
{
}
catch ( Web2PDFException ex )
{
}
catch ( Exception ex )
{
}

o (si necesita escribir un controlador general, lo que generalmente es una mala idea, pero si está seguro de que es lo mejor para usted, está seguro):

 if( err is Web2PDFException)
 {
 }

o (en ciertos casos, si necesita hacer cosas de jerarquía de tipos más complejas que no se pueden expresar con is )

 if( err.GetType().IsAssignableFrom(typeof(Web2PDFException)))
 {
 }

o cambia a VB.NET o F# y usa is o Type.IsAssignableFrom en filtros de excepción


Solución alternativa

En lugar de detener una sesión de depuración para agregar algunas declaraciones descartables para luego volver a compilar y reiniciar, ¿por qué no usar el depurador para responder esa pregunta? inmediatamente cuando se alcanza un punto de interrupción?

Eso se puede hacer abriendo el Immediate Window del depurador y escribiendo un GetType fuera de la excepción y presionando Enter . La ventana inmediata también permite interrogar variables según sea necesario.

Ver VS Docs:ventana inmediata

Por ejemplo, necesitaba saber cuál era la excepción y simplemente extraje el Name propiedad de GetType como tal sin tener que recompilar: