web-dev-qa-db-fra.com

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

try
{
     object result = processClass.InvokeMethod("Create", methodArgs);
}
catch (Exception e)
{  
    // Here I was hoping to get an error code.
}

Lorsque j'appelle la méthode WMI ci-dessus, on m'attend à ce que l'accès soit refusé. Dans mon bloc catch, je veux m'assurer que l'exception déclenchée était bien pour Access Denied. Existe-t-il un moyen d'obtenir le code d'erreur correspondant? Le code d'erreur Win32 pour Acceess Denied est 5 . Je ne veux pas rechercher dans le message d'erreur la chaîne refusée ou quoi que ce soit du genre. 

Merci

14
Frank Q.

essayez ceci pour vérifier l'exception et l'intérieur d'une exception dérivée 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   
}

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

  catch (BlahBlahException ex){  
      // do stuff   
  }

Aussi System.Exception a un HRESULT

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

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

31
Preet Sangha

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

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

4
iandotkelly

En vous basant 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 solution de grande taille 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é par unité.

Je ne vais pas trop insister 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 au sein de leurs propres blocs.

3
Thomas N.

Je vous suggère d'utiliser Message Properte de l'objet exception comme ci-dessous le code 

try
{
 object result = processClass.InvokeMethod("Create", methodArgs);
}
catch (Exception e)
{  
    //use Console.Write(e.Message); from Console Application 
    //and use MessageBox.Show(e.Message); from WindowsForm and WPF Application
}
1
user4509170