Saltar al contenido

Cómo obtener el código de error de excepción en C#

Este artículo fue aprobado por nuestros especialistas para garantizar la exactitud de nuestro contenido.

Solución:

Puede usar esto para verificar la excepción y la excepción interna para una excepción derivada de Win32Exception.

catch (Exception e)   
    var w32ex = e as Win32Exception;
    if(w32ex == null) 
        w32ex = e.InnerException as Win32Exception;
        
    if(w32ex != null) 
        int code =  w32ex.ErrorCode;
        // do stuff
        
    // do other stuff   

A partir de C# 6, when se puede usar en una instrucción catch para especificar una condición que debe cumplirse. true para que el controlador ejecute una excepción específica.

catch (Win32Exception ex) when (ex.InnerException is Win32Exception) 
    var w32ex = (Win32Exception)ex.InnerException;
    var code =  w32ex.ErrorCode;

Como en los comentarios, realmente necesita ver qué excepción se está lanzando realmente para comprender lo que puede hacer y, en cuyo caso, se prefiere una captura específica en lugar de simplemente capturar una excepción. Algo como:

  catch (BlahBlahException ex)   
      // do stuff   
  

También System.Exception tiene un HRESULT

 catch (Exception ex)   
     var code = ex.HResult;
 

Sin embargo, solo está disponible a partir de .NET 4.5.

Debería mirar a los miembros de la excepción lanzada, particularmente .Message y .InnerException.

También vería si la documentación para InvokeMethod le dice si arroja alguna clase de excepción más especializada que Exception, como Win32Exception sugerida por @Preet. Atrapar y simplemente mirar la clase base Exception puede no ser particularmente útil.

Sobre la base de la solución de Preet Sangha, lo siguiente debería cubrir con seguridad el escenario en el que está trabajando con una solución grande con el potencial de varias Excepciones internas.

 try
 
     object result = processClass.InvokeMethod("Create", methodArgs);
 
 catch (Exception e)
 
     // Here I was hoping to get an error code.
     if (ExceptionContainsErrorCode(e, 10004))
     
         // Execute desired actions
     
 

private bool ExceptionContainsErrorCode(Exception e, int ErrorCode)

    Win32Exception winEx = e as Win32Exception;
    if (winEx != null && ErrorCode == winEx.ErrorCode) 
        return true;

    if (e.InnerException != null) 
        return ExceptionContainsErrorCode(e.InnerException, ErrorCode);

    return false;

Este código ha sido probado por unidad.

No insistiré demasiado en la necesidad de llegar a apreciar e implementar buenas prácticas en lo que respecta al manejo de excepciones al administrar cada tipo de excepción esperado dentro de sus propios bloques.

Comentarios y calificaciones del post

Si piensas que te ha sido útil nuestro artículo, sería de mucha ayuda si lo compartieras con el resto entusiastas de la programación de esta forma nos ayudas a extender nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *