Partager via


Guide pratique : créer des exceptions définies par l’utilisateur avec des messages d’exception localisés

Dans cet article, vous allez apprendre à 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 à l’aide d’assemblys satellites.

Créer des exceptions personnalisées

.NET contient de nombreuses exceptions différentes que vous pouvez utiliser. Toutefois, dans certains cas, quand 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 :

  1. Créez une classe sérialisable qui hérite de Exception. Le nom de la classe doit se terminer par « Exception » :

    [Serializable]
    public class StudentNotFoundException : Exception { }
    
    <Serializable>
    Public Class StudentNotFoundException
        Inherits Exception
    End Class
    
  2. Ajoutez les constructeurs par défaut :

    [Serializable]
    public class StudentNotFoundException : Exception
    {
        public StudentNotFoundException() { }
    
        public StudentNotFoundException(string message)
            : base(message) { }
    
        public StudentNotFoundException(string message, Exception inner)
            : base(message, inner) { }
    }
    
    <Serializable>
    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
    
  3. Définissez les propriétés et les constructeurs supplémentaires :

    [Serializable]
    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;
        }
    }
    
    <Serializable>
    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 un .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 :

  1. Créez un dossier nommé Resources pour contenir les fichiers de ressources.

  2. 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.

  3. Ajoutez une paire nom/valeur pour votre message d’exception, comme le montre l’image suivante :

    Add resources to the default culture

  4. Ajoutez un nouveau fichier de ressources pour le français. Nommez-le ExceptionMessages.fr-FR.resx.

  5. Ajoutez à nouveau une paire nom/valeur pour le message d’exception, mais avec une valeur en français :

    Add resources to the fr-FR culture

  6. 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.

  7. 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 est TestProject.Resources.ExceptionMessages.

Voir aussi