Como criar exceções definidas pelo usuário com mensagens de exceção localizadas
Neste artigo, você aprenderá a criar exceções definidas pelo usuário que são herdadas da classe base Exception com mensagens de exceção localizadas usando assemblies satélite.
Criar exceções personalizadas
O .NET contém muitas exceções diferentes que você pode usar. No entanto, nos casos em que nenhum deles atende às suas necessidades, você pode criar sua própria exceção personalizada.
Vamos supor que você queira criar um StudentNotFoundException
que contenha uma StudentName
propriedade.
Para criar uma exceção personalizada, siga estas etapas:
Crie uma classe que herda do Exception. O nome da classe deve terminar em "Exceção":
public class StudentNotFoundException : Exception { }
Public Class StudentNotFoundException Inherits Exception End Class
Adicione os construtores padrão:
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
Defina quaisquer propriedades e construtores adicionais:
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
Criar mensagens de exceção localizadas
Você criou uma exceção personalizada e pode lançá-la em qualquer lugar com um código como o seguinte:
throw new StudentNotFoundException("The student cannot be found.", "John");
Throw New StudentNotFoundException("The student cannot be found.", "John")
O problema com a linha anterior é que "The student cannot be found."
é apenas uma cadeia de caracteres constante. Em um aplicativo localizado, você deseja ter mensagens diferentes, dependendo da cultura do usuário.
As montagens de satélite são uma boa maneira de fazer isso. Um assembly satélite é uma DLL que contém recursos para um idioma específico. Quando você solicita um recurso específico em tempo de execução, o CLR localiza esse recurso dependendo da cultura do usuário. Se nenhum assembly satélite for encontrado para essa cultura, os recursos da cultura padrão serão usados.
Para criar as mensagens de exceção localizadas:
Crie uma nova pasta chamada Recursos para armazenar os arquivos de recursos.
Adicione um novo arquivo de recurso a ele. Para fazer isso no Visual Studio, clique com o botão direito do mouse na pasta no Gerenciador de Soluções e selecione Adicionar>Novo Arquivo de Recursos de Item.> Nomeie o arquivo ExceptionMessages.resx. Este é o arquivo de recursos padrão.
Adicione um par nome/valor para sua mensagem de exceção, como mostra a imagem a seguir:
Adicione um novo arquivo de recurso para francês. Nomeie-o ExceptionMessages.fr-FR.resx.
Adicione um par nome/valor para a mensagem de exceção novamente, mas com um valor francês:
Depois de construir o projeto, a pasta de saída da compilação deve conter a pasta fr-FR com um arquivo .dll , que é o assembly satélite.
Você lança a exceção com um código como o seguinte:
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 o nome do projeto for
TestProject
e o arquivo de recurso ExceptionMessages.resx residir na pasta Recursos do projeto, o nome totalmente qualificado do arquivo de recurso seráTestProject.Resources.ExceptionMessages
.