Comment attraper l'original (intérieure) exception en C#?

je suis d'appeler une fonction qui renvoie une exception personnalisée:

GetLockOwnerInfo(...)

Cette fonction à son tour, est l'appel d'une fonction qui renvoie une exception:

GetLockOwnerInfo(...)
   ExecuteReader(...)

Cette fonction à son tour, est l'appel d'une fonction qui renvoie une exception:

GetLockOwnerInfo(...)
   ExecuteReader(...)
      ExecuteReader(...)

Et ainsi de suite:

GetLockOwnerInfo(...)
   ExecuteReader(...)
      ExecuteReader(...)
         ExecuteReaderClient(...)
             Fill(...)

L'une de ces fonctions renvoie une SqlException, bien que ce code n'a aucune idée de ce qu'est un SqlException est.

Des niveaux plus élevés d'envelopper ce SqlException dans un autre BusinessRuleException afin d'inclure certaines propriétés spéciales et des détails supplémentaires, tout en incluant le "original" exception comme InnerException:

catch (DbException ex)
{
    BusinessRuleExcpetion e = new BusinessRuleException(ex)
    ...
    throw e;
}

Des niveaux plus élevés d'envelopper ce BusinessRuleException dans un autre LockerException afin d'inclure certaines propriétés spéciales et des détails supplémentaires, tout en incluant le "original" exception comme InnerException:

catch (BusinessRuleException ex)
{
    LockerException e = new LockerException(ex)
    ...
    throw e;
}

Le problème maintenant est que je veux attraper le origianl SqlException, pour vérifier un code d'erreur particulier.

Mais il n'y a aucun moyen de "rattraper l'exception interne":

try
{
   DoSomething();
}
catch (SqlException e)
{
   if (e.Number = 247) 
   {
      return "Someone";
   }
   else
      throw;
}

je pensais au sujet de la capture SqlException droit quand il est lancé, et la copie de valeurs différentes pour la re-levée d'une exception - mais ce code ne dépend pas de Sql. Elle connaît un SqlException, mais il n'a pas de dépendance sur SqlException.

j'ai pensé à attraper toutes les exceptions:

try
{
   DoSomething(...);
}
catch (Exception e)
{
   SqlException ex = HuntAroundForAnSqlException(e);
   if (ex != null)
   {
      if (e.Number = 247) 
      {
          return "Someone";
      }
      else
         throw;
   }
   else
      throw;
}

Mais c'est horrible de code.

Étant donné que .NET ne vous permettent pas de modifier la Message d'un Exception pour inclure des informations supplémentaires, quel est le mécanisme prévu pour attraper origine des exceptions?

  • Si votre code à l'extérieur ne se soucient pas de savoir SqlException, il ne devrait probablement pas être intéressés par l'accès à ce champs. Je dirais que la couche enveloppant dans une nouvelle exception devrait se traduire SQL spécificités qui peuvent être d'intérêt pour l'équivalent générique (comme un FailureReason enum ou quelque chose).
  • Le problème est que la personne qui attrape le DbException ne pas/ne peut pas avoir une dépendance sur System.Data.SqlClient
InformationsquelleAutor Ian Boyd | 2012-01-09