Comment obtenir le code d'erreur d'exception en C #

Comment obtenir le code d'erreur d'exception en C #

Vous pouvez l'utiliser pour vérifier l'exception et l'exception interne pour une exception dérivée 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   
}

À partir de C# 6, when peut être utilisé dans une instruction catch pour spécifier une condition qui doit être vraie pour que le gestionnaire exécute une exception spécifique.

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

Comme dans les commentaires, vous avez vraiment besoin de voir quelle exception est réellement lancée pour comprendre ce que vous pouvez faire, et dans ce cas, une capture spécifique est préférée à la simple capture d'une exception. Quelque chose comme :

  catch (BlahBlahException ex) {  
      // do stuff   
  }

System.Exception a également un HRESULT

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

Cependant, il n'est disponible qu'à partir de .NET 4.5.


Vous devriez regarder les membres de l'exception levée, en particulier .Message et .InnerException .

Je voudrais également voir si la documentation d'InvokeMethod vous indique si elle lance une classe d'exception plus spécialisée que Exception - telle que l'exception Win32suggérée par @Preet. Attraper et simplement regarder la classe de base Exception peut ne pas être particulièrement utile.


En s'appuyant sur la solution de Preet Sangha, les éléments suivants devraient couvrir en toute sécurité le scénario dans lequel vous travaillez avec une grande solution avec le potentiel de plusieurs exceptions internes.

 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;
}

Ce code a été testé unitaire.

Je n'insisterai pas trop sur la nécessité d'apprécier et de mettre en œuvre les bonnes pratiques en matière de gestion des exceptions en gérant chaque type d'exception attendu dans leurs propres blocs.