69 votes

La meilleure façon de vérifier l'exception interne ?

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 ?

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.

87voto

jrista Points 20950

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();

0 votes

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 ?

0 votes

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.

0 votes

Merci, cela m'a aidé à trouver l'InnerException d'une exception lancée par EntityFramework.

68voto

Andrew Hare Points 159332

Est-ce que c'est ce que vous recherchez ?

String innerMessage = (ex.InnerException != null) 
                      ? ex.InnerException.Message
                      : "";

3 votes

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

1 votes

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

0 votes

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

50voto

csharptest.net Points 16556

C'est drôle, je ne peux pas trouver quelque chose de mal avec Exception.GetBaseException() ?

repEvent.InnerException = ex.GetBaseException().Message;

0 votes

Super, avec cela vous n'avez pas besoin de faire une méthode personnalisée pour naviguer à travers toutes les exceptions imbriquées.

1 votes

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.

0 votes

Pourquoi cette réponse n'est-elle pas encore acceptée comme la réponse correcte ?

17voto

Noldorin Points 67794

La solution la plus simple consiste à utiliser une expression conditionnelle de base :

repEvent.InnerException = ex.InnerException == null ? 
    null : ex.InnerException.Message;

0 votes

Il n'y a aucun problème, c'est juste que le code d'Andrew retournait une chaîne.

0 votes

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

0 votes

@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).

15voto

Yaur Points 4362

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

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.

Powered by:

X