Je sais que parfois innerException est nul
Ainsi, ce qui suit pourrait échouer :
repEvent.InnerException = ex.InnerException.Message;
Existe-t-il un moyen rapide et ternaire de vérifier si innerException est nul ou non ?
Je sais que parfois innerException est nul
Ainsi, ce qui suit pourrait échouer :
repEvent.InnerException = ex.InnerException.Message;
Existe-t-il un moyen rapide et ternaire de vérifier si innerException est nul ou non ?
De bonnes réponses jusqu'à présent. Sur une note similaire, mais différente, il y a parfois plus d'un niveau d'exceptions imbriquées. Si vous voulez obtenir l'exception racine qui a été lancée à l'origine, quelle que soit la profondeur, vous pouvez essayer ceci :
public static class ExceptionExtensions
{
public static Exception GetOriginalException(this Exception ex)
{
if (ex.InnerException == null) return ex;
return ex.InnerException.GetOriginalException();
}
}
Et en cours d'utilisation :
repEvent.InnerException = ex.GetOriginalException();
Est-ce que j'ai raté quelque chose ici ou est-ce que ex.GetOriginalException() pour innerException n'est pas un ex de niveau supérieur ?
Je ne suis pas sûr de ce que vous demandez. GetOriginalException renvoie l'exception d'origine qui a déclenché toute la chaîne d'exceptions, qu'il n'y ait qu'une seule exception (pas d'InnerException du tout) ou plusieurs niveaux d'InnerExceptions.
De plus, est-ce que c'est juste moi, ou est-ce que ça aurait l'air plus propre si les arguments étaient inversés et que l'option !=
changé en ==
.
@Noldorin - Désolé mec, j'ai répondu à cette question et je n'ai pas vérifié si j'étais le premier ! @JL - Noldorin a été le premier à sortir de la chute avec la bonne réponse, veuillez lui transférer la réponse acceptée.
@Andrew : Heh, pas besoin de s'excuser. :) Je ne suis pas du genre à m'énerver pour une question insignifiante, j'étais juste curieux de connaître la raison de JL principalement.
C'est drôle, je ne peux pas trouver quelque chose de mal avec Exception.GetBaseException() ?
repEvent.InnerException = ex.GetBaseException().Message;
Super, avec cela vous n'avez pas besoin de faire une méthode personnalisée pour naviguer à travers toutes les exceptions imbriquées.
Je viens d'avoir un exemple où j'ai essayé d'utiliser GetBaseException pour un Task<String> pour HttpClient, et cela continuait à retourner une exception de plus haut niveau. Lorsque j'ai mis en œuvre la solution de Jrista, elle a renvoyé le message "Machine actively refused " que je recherchais.
@JL : En fait, mind renvoie un string
aussi. J'ai juste supposé, d'après le code, que vous appeliez la fonction string
propriété InnerException
(juste pour être confus ?). Mais ce n'est pas grave. @Andrew : Merci. Et même si ça ne me dérange pas du tout, +1 au vôtre pour la courtoisie.
@Nordorin, Ah je vois d'où vient le problème, j'ai opté pour la chaîne parce que les exceptions ne se sérialisent pas bien (si elles le font du tout).
Pourquoi tant de récurrence dans ces réponses ?
public static class ExceptionExtensions
{
public static Exception GetOriginalException(this Exception ex)
{
while(ex.InnerException != null)ex = ex.InnerException;
return ex;
}
}
Cela semble être un moyen beaucoup plus direct de mettre en œuvre cette mesure.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
Vous pourriez souhaiter revoir votre réponse acceptée. La réponse de jrista est meilleure que les autres, car une InnerException peut avoir sa propre InnerException.
4 votes
N'oubliez pas que ToString parcourt les exceptions internes et les combine pour vous. Cela peut être un raccourci pratique lors de la journalisation.