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