84 votes

Comment trouver l'exception la plus interne sans utiliser de boucle while?

Lorsque C # lève une exception, il peut avoir une exception interne. Ce que je veux faire, c'est obtenir l'exception la plus interne ou, en d'autres termes, l'exception feuille qui ne possède pas d'exception interne. Je peux le faire en boucle while:

 while (e.InnerException != null)
{
    e = e.InnerException;
}
 

Mais je me demandais s’il y avait une compagnie aérienne que je pourrais utiliser à la place.

142voto

Draco Ater Points 8468

Bon mot :)

 while (e.InnerException != null) e = e.InnerException;
 

De toute évidence, vous ne pouvez pas faire plus simple.

122voto

Josh Sutterfield Points 756

Je crois que Exception.GetBaseException() fait la même chose que ces solutions. http://msdn.microsoft.com/en-us/library/system.exception.getbaseexception(v=vs.71).aspx

24voto

Glenn McElhoe Points 21

La boucle par InnerExceptions est le seul moyen fiable.

Si l'exception interceptée est une AggregateException, alors GetBaseException() renvoie uniquement l'exception AggregateException la plus interne.

http://msdn.microsoft.com/en-us/library/system.aggregateexception.getbaseexception.aspx

13voto

dtb Points 104373

Si vous ne savez pas à quelle profondeur les exceptions internes sont imbriquées, il n'y a aucun moyen de contourner une boucle ou une récursion.

Bien sûr, vous pouvez définir une méthode d’extension qui résume ceci:

 public static class ExceptionExtensions
{
    public static Exception GetInnermostException(this Exception e)
    {
        if (e == null)
        {
            throw new ArgumentNullException("e");
        }

        while (e.InnerException != null)
        {
            e = e.InnerException;
        }

        return e;
    }
}
 

10voto

Matt Points 2320

Je sais que ceci est un ancien post, mais je suis surpris que personne n'ait suggéré GetBaseException() qui est une méthode de la classe Exception :

 catch (Exception x)
{
    var baseException = x.GetBaseException();
}
 

Cela existe depuis .NET 1.1. Documentation ici: http://msdn.microsoft.com/en-us/library/system.exception.getbaseexception(v=vs.71).aspx

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