web-dev-qa-db-fra.com

Quelles sont les meilleures pratiques standard de l'industrie pour l'implémentation d'exceptions personnalisées en C #?

Quelles sont les meilleures pratiques standard de l'industrie pour l'implémentation d'exceptions personnalisées en C #?

J'ai vérifié Google et il existe un grand nombre de recommandations, mais je ne sais pas lesquelles sont plus crédibles.

Si quelqu'un a des liens vers des articles faisant autorité, cela serait également utile.

63
Darren Young

La norme pour la création d'exceptions personnalisées est dérivée de Exception . Vous pouvez ensuite introduire vos propres propriétés/méthodes et constructeurs surchargés (le cas échéant).

Voici un exemple de base d'un ConnectionFailedException personnalisé qui accepte un paramètre supplémentaire spécifique au type d'exception.

[Serializable]
public class ConnectionFailedException : Exception
{
    public ConnectionFailedException(string message, string connectionString)
        : base(message)
    {
        ConnectionString = connectionString;
    }

    public string ConnectionString { get; private set; }
}

Dans l'application, cela pourrait être utilisé dans des scénarios où l'application tente de se connecter à une base de données, par exemple.

try
{
    ConnectToDb(AConnString);
}
catch (Exception ex)
{
    throw new ConnectionFailedException(ex.Message, AConnString);
}

A vous de gérer ensuite le ConnectionFailedException à un niveau supérieur (le cas échéant)

Jetez également un œil à Designing Custom Exceptions and Custom Exceptions

67
James

Voici le code pour créer une exception personnalisée:

using System;
using System.Runtime.Serialization;

namespace YourNamespaceHere
{
    [Serializable()]
    public class YourCustomException : Exception, ISerializable
    {
        public YourCustomException() : base() { }
        public YourCustomException(string message) : base(message) { }
        public YourCustomException(string message, System.Exception inner) : base(message, inner) { }
        public YourCustomException(SerializationInfo info, StreamingContext context) : base(info, context) { }
    }
}

Voir aussi: http://www.capprime.com/software_development_weblog/2005/06/16/CreatingACustomExceptionClassInC.aspx

9
Michael Maddox

Je suppose que vous recherchez des pratiques de gestion des exceptions. Alors regardez les articles suivants,

http://msdn.Microsoft.com/en-us/library/ms229014.aspx // donne des idées générales sur les exceptions, y compris les exceptions personnalisées

http://blogs.msdn.com/b/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx //

8
paragy

J'utilise des exceptions personnalisées pour communiquer la nature de l'erreur.

Par exemple, j'aime utiliser le framework fourni "ArgumentNullException" pour vérifier les arguments. Plus tard, lorsque je vois cette erreur dans le débogueur ou dans un journal d'erreurs, je connais immédiatement la nature de l'erreur sans lire plus loin.

L'autre extrémité du spectre est l'exception InvalidOperationException qui pourrait signifier à peu près n'importe quoi.

L'alternative aux exceptions personnalisées est des messages d'erreur détaillés. C'est correct, mais en faisant une exception personnalisée telle que ConnectionFailed est plus significatif. Ensuite, le message lui-même peut donner plus de détails.

Lors de la création de telles exceptions personnalisées, je n'ajoute aucune nouvelle propriété. La raison en est que si vous avez un enregistreur d'erreurs, vous voulez qu'il fonctionne sur toutes les exceptions. Si vous ajoutez une propriété spéciale, l'enregistreur d'erreurs va l'ignorer. Par exemple, si vous utilisez MSTest, lorsque vous exécutez votre test et qu'il échoue, les propriétés personnalisées ne sont pas affichées. Mais si vous vous en tenez à la propriété Message de la classe de base, elle s'affichera très bien.

Le sous-classement est donc très simple:

public class NavigationException : Exception{
    public NavigationException() {}
    public NavigationException(string msg) : base(msg) {}
    public NavigationException(string msg, Exception inner) : base(msg, inner) {}
}

C'est très simple, fonctionne avec n'importe quel enregistreur d'erreurs, et quand je le vois, je sais que c'était un problème de navigation et je peux voir les détails si nécessaire.

Greg

1
Greg Gum