Interception et levée des types d'exception standard
Les règles suivantes décrivent les meilleures pratiques pour quelques-unes des exceptions les plus courantes fournies par le .NET Framework.
Exception et SystemException
Ne levez pas d'exception System.Exception ou System.SystemException.
N'interceptez pas d'exception System.Exception ou System.SystemException dans le code d'infrastructure, sauf si vous avez l'intention de la lever à nouveau.
Évitez d'intercepter System.Exception ou System.SystemException, sauf dans les gestionnaires d'exceptions de niveau supérieur.
ApplicationException
Dérivez des exceptions personnalisées de la classe T:System.Exception plutôt que la classe T:System.ApplicationException.
À l'origine, il était prévu que les exceptions personnalisées devraient dériver de la classe ApplicationException ; toutefois, il s'est avéré que cette méthode n'apportait pas beaucoup d'avantages. Pour plus d'informations, consultez Meilleures pratiques pour la gestion des exceptions.
InvalidOperationException
Levez une exception System.InvalidOperationException si l'état n'est pas approprié. Une exception System.InvalidOperationException doit être levée si une propriété Set ou un appel à une méthode n'est pas approprié compte tenu de l'état actuel de l'objet. Par exemple, écrire dans un objet System.IO.FileStream ouvert en lecture doit lever une exception System.InvalidOperationException.
Cette exception doit être également levée lorsque l'état combiné d'un ensemble d'objets connexes n'est pas valide pour l'opération.
ArgumentException, ArgumentNullException et ArgumentOutOfRangeException
Levez l'exception System.ArgumentException ou l'un de ses sous-types si des arguments incorrects sont passés à un membre. Lorsque c'est possible, utilisez de préférence le type d'exception le plus dérivé.
L'exemple de code suivant illustre la levée d'une exception lorsqu'un argument est null (Nothing en Visual Basic).
If (anObject = Nothing) Then
Throw New ArgumentNullException("anObject", "Specify a non-null argument.")
End If
if (anObject == null)
{
throw new ArgumentNullException("anObject",
"Specify a non-null argument.");
}
if (anObject == nullptr)
{
throw gcnew ArgumentNullException("anObject",
"Specify a non-null argument.");
}
Définissez la propriété System.ArgumentException.ParamName lors de la levée d'une exception System.ArgumentException ou d'un de ses types dérivés. Cette propriété stocke le nom du paramètre qui a provoqué la levée de l'exception. Notez que la propriété peut être définie à l'aide de l'une des surcharges de constructeur.
Utilisez une valeur comme nom du paramètre de valeur implicite des accesseurs Set de propriété.
L'exemple de code suivant illustre une propriété qui lève une exception si l'appelant passe un argument null.
Public Property Address() As IPAddress
Get
Return IPaddr
End Get
Set(ByVal value As IPAddress)
If IsNothing(value) Then
Throw New ArgumentNullException("value")
End If
IPaddr = value
End Set
End Property
public IPAddress Address
{
get
{
return address;
}
set
{
if(value == null)
{
throw new ArgumentNullException("value");
}
address = value;
}
}
property IPAddress^ Address
{
IPAddress^ get()
{
return address;
}
void set(IPAddress^ value)
{
if (value == nullptr)
{
throw gcnew ArgumentNullException("value");
}
address = value;
}
}
N'autorisez pas des API pouvant être appelées publiquement à lever explicitement ou implicitement des exceptions System.NullReferenceException, System.AccessViolationException, System.InvalidCastException ou System.IndexOutOfRangeException. Procédez à une vérification d'arguments pour éviter la levée de telles exceptions. La levée de ces exceptions expose des détails d'implémentation de votre méthode susceptibles de changer avec le temps.
StackOverflowException
Ne levez pas d'exception System.StackOverflowException explicitement. Cette exception doit être levée explicitement uniquement par le Common Language Runtime (CLR).
N'interceptez pas d'exception System.StackOverflowException.
Il est extrêmement difficile de gérer un dépassement de capacité de la pile par programme. Vous devez permettre à cette exception d'arrêter le processus et utiliser le débogage pour identifier la source du problème.
OutOfMemoryException
Ne levez pas d'exception System.OutOfMemoryException explicitement. Cette exception doit être levée uniquement par l'infrastructure du CLR.
ComException et SEHException
Ne levez pas d'exception System.Runtime.InteropServices.COMException ou System.Runtime.InteropServices.SEHException explicitement. Ces exceptions doivent être levées uniquement par l'infrastructure du CLR.
N'interceptez pas explicitement d'exception System.Runtime.InteropServices.SEHException.
ExecutionEngineException
Ne levez pas explicitement d'exception System.ExecutionEngineException.
Portions Copyright 2005 Microsoft Corporation. Tous droits réservés.
Portions Copyright Addison-Wesley Corporation. Tous droits réservés.
Pour plus d'informations sur les règles de conception, consultez « règles de conception d'infrastructure : Conventions idiomes et modèles carnet de bibliothèques réutilisables framework » Krzysztof Cwalina et Brad Abrams, publiés par Addison-Wesley, 2005.
Voir aussi
Concepts
Choix du type correct d'exception à lever
Autres ressources
Instructions de conception pour le développement de bibliothèques de classes