67 votes

Quelles sont les meilleures pratiques standard du secteur pour la mise en œuvre d'exceptions personnalisées en C# ?

Quelles sont les meilleures pratiques standard du secteur pour la mise en œuvre d'exceptions personnalisées en C# ?

J'ai consulté Google et il y a un grand nombre de recommandations, mais je ne sais pas lesquelles sont les plus crédibles.

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

67voto

James Points 40024

La norme pour la création d'exceptions personnalisées est de dériver 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 système personnalisé ConnectionFailedException qui prend en compte 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 ex.

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

C'est à vous de vous occuper ensuite de la ConnectionFailedException à un niveau supérieur (le cas échéant)

Jetez également un coup d'œil à Conception d'exceptions personnalisées y Exceptions personnalisées

9voto

Michael Maddox Points 7345

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

8voto

alliswell Points 3064

Je suppose que vous recherchez des pratiques de traitement des exceptions. Jetez donc un coup d'oeil aux 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 //

1voto

Greg Gum Points 1441

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

Par exemple, j'aime utiliser l'exception "ArgumentNullException" fournie par le framework pour vérifier les arguments. Plus tard, lorsque je vois cette erreur, soit dans le débogueur, soit dans un journal d'erreurs, je connais immédiatement la nature de l'erreur sans avoir à lire davantage.

À l'autre extrémité du spectre se trouve l'exception InvalidOperationException, qui peut signifier à peu près n'importe quoi.

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

Lorsque je crée ces exceptions personnalisées, je n'ajoute pas de nouvelles propriétés. La raison en est que si vous avez un journal d'erreurs, vous voulez qu'il fonctionne sur toutes les exceptions. Si vous ajoutez une propriété spéciale, le collecteur 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, l'affichage sera parfait.

La sous-classification 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, cela fonctionne avec n'importe quel enregistreur d'erreurs, et lorsque je le vois, je sais qu'il s'agissait d'un problème de navigation et je peux consulter les détails si nécessaire.

Greg

0voto

Singgum3b Points 77

MSDN recommande de concevoir correctement les exceptions personnalisées : http://msdn.microsoft.com/en-us/library/ms229064(v=vs.100).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