Come creare eccezioni definite dall'utente con messaggi di eccezione localizzati

In questo articolo si apprenderà come creare eccezioni definite dall'utente ereditate dalla classe base Exception con messaggi di eccezione localizzati usando assembly satellite.

Creare eccezioni personalizzate

.NET contiene molte eccezioni diverse che è possibile usare. Tuttavia, in alcuni casi, quando nessuno di essi soddisfa le proprie esigenze, è possibile creare eccezioni personalizzate personalizzate.

Si supponga di voler creare un oggetto StudentNotFoundException contenente una StudentName proprietà. Per creare un'eccezione personalizzata, seguire questa procedura:

  1. Creare una classe serializzabile che eredita da Exception. Il nome della classe deve terminare in "Exception":

    [Serializable]
    public class StudentNotFoundException : Exception { }
    
    <Serializable>
    Public Class StudentNotFoundException
        Inherits Exception
    End Class
    
  2. Aggiungere i costruttori predefiniti:

    [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. Definire eventuali proprietà e costruttori aggiuntivi:

    [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
    

Creare messaggi di eccezione localizzati

È stata creata un'eccezione personalizzata e è possibile generarla ovunque con codice simile al seguente:

throw new StudentNotFoundException("The student cannot be found.", "John");
Throw New StudentNotFoundException("The student cannot be found.", "John")

Il problema con la riga precedente è che "The student cannot be found." è solo una stringa costante. In un'applicazione localizzata si vogliono avere messaggi diversi a seconda delle impostazioni cultura utente. Gli assembly satellite sono un buon modo per farlo. Un assembly satellite è un .dll che contiene risorse per una lingua specifica. Quando si chiede una risorsa specifica in fase di esecuzione, CLR individua tale risorsa a seconda delle impostazioni cultura utente. Se non viene trovato alcun assembly satellite per tale cultura, vengono usate le risorse delle impostazioni cultura predefinite.

Per creare i messaggi di eccezione localizzati:

  1. Creare una nuova cartella denominata Resources per contenere i file di risorse.

  2. Aggiungere un nuovo file di risorse. A tale scopo in Visual Studio, fare clic con il pulsante destro del mouse sulla cartella in Esplora soluzioni e scegliere Aggiungi> nuovofile risorseelemento>. Assegnare un nome al file ExceptionMessages.resx. Si tratta del file di risorse predefinito.

  3. Aggiungere una coppia nome/valore per il messaggio di eccezione, come illustrato nell'immagine seguente:

    Aggiungere risorse alle impostazioni cultura predefinite

  4. Aggiungere un nuovo file di risorse per francese. Denominarlo ExceptionMessages.fr-FR.resx.

  5. Aggiungere di nuovo una coppia nome/valore per il messaggio di eccezione, ma con un valore francese:

    Aggiungere risorse alle impostazioni cultura fr-FR

  6. Dopo aver compilato il progetto, la cartella di output della compilazione deve contenere la cartella fr-FR con un file .dll , ovvero l'assembly satellite.

  7. Si genera l'eccezione con codice simile al seguente:

    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")
    

    Nota

    Se il nome del progetto è TestProject e il file di risorse ExceptionMessages.resx risiede nella cartella Risorse del progetto, il nome completo del file di risorse è TestProject.Resources.ExceptionMessages.

Vedi anche