Come creare eccezioni definite dall'utente con messaggi di eccezione localizzati
In questo articolo si apprende 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, nei casi in cui nessuno di essi soddisfa le proprie esigenze, è possibile creare un'eccezioni personalizzata.
Si supponga di voler creare un oggetto StudentNotFoundException
contenente una proprietà StudentName
.
Per creare un'eccezione personalizzata, seguire questa procedura:
Creare una classe che eredita da Exception. Il nome della classe deve terminare in "Exception":
public class StudentNotFoundException : Exception { }
Public Class StudentNotFoundException Inherits Exception End Class
Aggiungere i costruttori predefiniti:
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
Definire eventuali proprietà e costruttori aggiuntivi:
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
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:
Creare una nuova cartella denominata Risorse per contenere i file di risorse.
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.
Aggiungere una coppia nome/valore per il messaggio di eccezione, come illustrato nell'immagine seguente:
Aggiungere un nuovo file di risorse per il francese. Denominarlo ExceptionMessages.fr-FR.resx.
Aggiungere di nuovo una coppia nome/valore per il messaggio di eccezione, ma con un valore francese:
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.
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
.