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’access 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 le message d’erreur pour la chaîne refusée ou quoi que ce soit du genre.

Merci

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 lancée pour comprendre ce que vous pouvez faire, et dans quel cas une capture spécifique est préférée à une capture unique. Quelque chose comme:

  catch (BlahBlahException ex){ // do stuff } 

Aussi System.Exception a un HRESULT

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

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 Win32Exception suggérée par @Preet. Attraper et simplement regarder la classe de base Exception peut ne pas être particulièrement utile.

Je vous suggère d’utiliser Message Properte de l’object 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 } 

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és.

Je ne parlerai pas trop de 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.

Une autre méthode consiste à obtenir directement le code d’erreur de la classe d’exception. Par exemple:

 catch (Exception ex) { if (ex.InnerException is ServiceResponseException) { ServiceResponseException srex = ex.InnerException as ServiceResponseException; ssortingng ErrorCode = srex.ErrorCode.ToSsortingng(); } }