Condividi tramite


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. In alcuni casi, tuttavia, quando nessuno di essi soddisfa le proprie esigenze, è possibile creare eccezioni personalizzate.

Si supponga di voler creare un oggetto StudentNotFoundException contenente una proprietà StudentName. 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 ed è possibile generarla in qualsiasi punto 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 dell'utente. Gli assembly satellite sono un buon modo per farlo. Un assembly satellite è un .dll che contiene risorse per una lingua specifica. Quando si richiede una risorsa specifica in fase di esecuzione, CLR trova tale risorsa in base alle impostazioni cultura dell'utente. Se non viene trovato alcun assembly satellite per tali impostazioni cultura, vengono usate le risorse delle impostazioni cultura predefinite.

Per creare i messaggi di eccezione localizzati:

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

  2. Aggiungervi 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 selezionare Aggiungi>Nuovo elemento>File risorse. Denominare il 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:

    Add resources to the default culture

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

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

    Add resources to the fr-FR culture

  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. Viene generata 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 si trova nella cartella Risorse del progetto, il nome completo del file di risorse è TestProject.Resources.ExceptionMessages.

Vedi anche