Guide pratique : créer des exceptions définies par l’utilisateur avec des messages d’exception localisés
Dans cet article, vous découvrez comment créer des exceptions définies par l’utilisateur héritées de la classe de base Exception avec des messages d’exception localisés en utilisant des assemblys satellites.
Créer des exceptions personnalisées
.NET contient de nombreuses exceptions différentes que vous pouvez utiliser. Cependant, dans les cas où aucune d’entre elles ne répond à vos besoins, vous pouvez créer vos propres exceptions personnalisées.
Supposons que vous souhaitiez créer un StudentNotFoundException
qui contient une propriété StudentName
.
Pour créer un point de terminaison personnalisé, procédez comme suit :
Créez une classe qui hérite de Exception. Le nom de la classe doit se terminer par « Exception » :
public class StudentNotFoundException : Exception { }
Public Class StudentNotFoundException Inherits Exception End Class
Ajoutez les constructeurs par défaut :
public class StudentNotFoundException : Exception { public StudentNotFoundException() { } public StudentNotFoundException(string message) : base(message) { } public StudentNotFoundException(string message, Exception inner) : base(message, inner) { } }
Public Class StudentNotFoundException Inherits Exception Public Sub New() End Sub Public Sub New(message As String) MyBase.New(message) End Sub Public Sub New(message As String, inner As Exception) MyBase.New(message, inner) End Sub End Class
Définissez les propriétés et les constructeurs supplémentaires :
public class StudentNotFoundException : Exception { public string StudentName { get; } public StudentNotFoundException() { } public StudentNotFoundException(string message) : base(message) { } public StudentNotFoundException(string message, Exception inner) : base(message, inner) { } public StudentNotFoundException(string message, string studentName) : this(message) { StudentName = studentName; } }
Public Class StudentNotFoundException Inherits Exception Public ReadOnly Property StudentName As String Public Sub New() End Sub Public Sub New(message As String) MyBase.New(message) End Sub Public Sub New(message As String, inner As Exception) MyBase.New(message, inner) End Sub Public Sub New(message As String, studentName As String) Me.New(message) StudentName = studentName End Sub End Class
Créer les messages d’exception localisés
Vous avez créé une exception personnalisée et vous pouvez la lever n’importe où avec du code comme suit :
throw new StudentNotFoundException("The student cannot be found.", "John");
Throw New StudentNotFoundException("The student cannot be found.", "John")
Le problème avec la ligne précédente est que "The student cannot be found."
est simplement une chaîne constante. Dans une application localisée, vous souhaitez avoir des messages différents en fonction de la culture de l’utilisateur.
Les assemblys satellites sont un bon moyen de le faire. Un assembly satellite est une DLL qui contient des ressources pour une langue spécifique. Lorsque vous demandez une ressource spécifique au moment de l’exécution, le CLR trouve cette ressource en fonction de la culture de l’utilisateur. Si aucun assembly satellite n’est trouvé pour cette culture, les ressources de la culture par défaut sont utilisées.
Pour créer les messages d’exception localisés :
Créez un dossier nommé Resources pour contenir les fichiers de ressources.
Ajoutez-y un nouveau fichier de ressources. Pour ce faire dans Visual Studio, faites un clic droit sur le dossier dans Explorateur de solutions, puis sélectionnez Ajouter>Nouvel élément>Fichier de ressources. Nommez le fichier ExceptionMessages.resx. Il s’agit du fichier de ressources par défaut.
Ajoutez une paire nom/valeur pour votre message d’exception, comme le montre l’image suivante :
Ajoutez un nouveau fichier de ressources pour le français. Nommez-le ExceptionMessages.fr-FR.resx.
Ajoutez à nouveau une paire nom/valeur pour le message d’exception, mais avec une valeur en français :
Après avoir généré le projet, le dossier de sortie de build doit contenir le dossier fr-FR avec un fichier .dll, qui est l’assembly satellite.
Vous levez l’exception avec du code semblable à ce qui suit :
var resourceManager = new ResourceManager("FULLY_QUALIFIED_NAME_OF_RESOURCE_FILE", Assembly.GetExecutingAssembly()); throw new StudentNotFoundException(resourceManager.GetString("StudentNotFound"), "John");
Dim resourceManager As New ResourceManager("FULLY_QUALIFIED_NAME_OF_RESOURCE_FILE", Assembly.GetExecutingAssembly()) Throw New StudentNotFoundException(resourceManager.GetString("StudentNotFound"), "John")
Notes
Si le nom du projet est
TestProject
et que le fichier de ressources ExceptionMessages.resx réside dans le dossier Resources du projet, le nom complet du fichier de ressources estTestProject.Resources.ExceptionMessages
.