Les éléments suivants sont effectivement les mêmes (dans les résultats):
catch (Exception e)
{
FunctionA(e);
FunctionB(e);
}
Mais ce n'est pas la même chose si vous faites ceci:
catch (ApplicationException e)
{
FunctionB(e);
}
catch (Exception e)
{
FunctionA(e);
}
C'est parce que FunctionB se tapée à ApplicationException au moment de la compilation , où l'appel à FunctionA va toujours réduire le paramètre à Exception. Selon votre implémentation de FunctionB, cela peut ne pas importer, mais il y a des cas où cela peut faire la différence. Je dirais qu'en règle générale, si votre implémentation de méthode n'a pas besoin de l'implémentation générique, ne l'utilisez pas.
Voici quelques exemples de cas où il serait question:
public T AddSomeContextToThisException<T>(T ex) where T : Exception
{
ex.Data.Add("Some key", "Some context message");
return ex;
}
public T ThisIsABadIdeaForExceptionsButMaybeAGoodIdeaForOtherTypes<T>(T ex) where T : Exception, new()
{
// do something with ex
return new T();
}
L'exemple suivant a besoin d'un code supplémentaire pour le contexte, donc voir le code dessous:
private readonly Bar bar = new Bar();
public void HandExceptionOffToSomethingThatNeedsToBeStronglyTyped<T>(T ex) where T : Exception
{
ICollection<T> exceptions = bar.GetCollectionOfExceptions<T>();
exceptions.Add(ex);
// do other stuff
}
public class Bar
{
// value is object, because .net doesn't have covariance yet
private Dictionary<Type, object> listsOfExceptions = new Dictionary<Type, object>();
public ICollection<T> GetCollectionOfExceptions<T>()
{
if (!listsOfExceptions.ContainsKey(typeof(T)))
{
listsOfExceptions.Add(typeof(T), new List<T>());
}
return listsOfExceptions[typeof(T)] as List<T>;
}
}
Si ApplicationException était une sous-classe d'Exception, ne seraient-ils pas toujours les mêmes? Essaie/Attrape les blocs que je comprends; Cependant, je suis plus préoccupé par s'il y a des différences ou des avantages entre les deux. – JamesEggers
Si vous ne pouvez pas voir un avantage dans la mise en œuvre, alors il n'y a aucun avantage et très peu de différence. Voir la réponse de @ Samuel et mon commentaire à ce sujet pour certains cas où cela est important. –
Je comprends maintenant. Merci. – JamesEggers