2009-03-19 11 views
2

Supposons qu'une exception particulière « SomeException » fait partie de la pile d'exception,Comment localiser une exception particulière dans une pile d'exception

donc supposons ex.InnerException.InnerException.InnerException est de type « SomeException »

Est il y a-t-il une API intégrée en C# qui va essayer de localiser un type d'exception donné dans la pile d'exceptions?

Exemple:

SomeException someExp = exp.LocateExceptionInStack(typeof(SomeException)); 
+0

Je ne pense pas que ce soit le cas, car vous ne voulez probablement pas le faire. Pourquoi voudriez-vous gérer les exceptions de manière si alambiquée? – Grzenio

+0

J'avais besoin de faire ceci auparavant, essayant de trouver un type particulier d'exception d'Oracle quelque part dans une pile qui avait des profondeurs variables selon la cause. –

+0

Ah, Oracle, assez juste :) – Grzenio

Répondre

6

Non, je ne crois pas qu'il y ait construit de façon de le faire. Ce n'est pas difficile d'écrire que:

public static T LocateException<T>(Exception outer) where T : Exception 
{ 
    while (outer != null) 
    { 
     T candidate = outer as T; 
     if (candidate != null) 
     { 
      return candidate; 
     } 
     outer = outer.InnerException; 
    } 
    return null; 
} 

Si vous utilisez C# 3, vous pourriez en faire une méthode d'extension (juste faire le paramètre « cette exception externe ») et il serait encore plus agréable à utiliser:

SomeException nested = originalException.Locate<SomeException>(); 

(Notez le raccourcissement du nom et - adapter à votre goût :)

1

Il est à seulement 4 lignes de code:

public static bool Contains<T>(Exception exception) 
     where T : Exception 
    { 
     if(exception is T) 
      return true; 

     return 
      exception.InnerException != null && 
      LocateExceptionInStack<T>(exception.InnerException); 
    } 
+0

S'il est supposé faire de la récursivité, vous pouvez décider de l'appeler Contient ou LocateExceptionInStack ... –