Como criar exceções definidas pelo usuário com mensagens de exceção localizadas
Neste artigo, você aprende 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élites.
Criar exceções personalizadas
O .NET contém muitas exceções diferentes que você pode usar. No entanto, em alguns casos, quando nenhuma delas atender às suas necessidades, você poderá criar suas exceções personalizadas.
Vamos supor que você queira criar um StudentNotFoundException
que contenha uma propriedade StudentName
.
Para criar um ponto de extremidade personalizado, siga estas etapas:
Crie uma classe que herda de Exception. O nome da classe deve terminar com "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 todas as 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, convém ter mensagens diferentes dependendo da cultura do usuário.
Assemblies satélite são uma boa maneira de fazer isso. Um assembly satélite é um DLL que contém recursos para uma linguagem específica. Quando você solicita recursos específicos 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, serão usados os recursos da cultura padrão.
Para criar mensagens de exceção localizadas:
Crie uma nova pasta chamada Recursos para armazenar os arquivos de recurso.
Adicione um novo arquivo de recurso a ela. 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 item>Arquivo de recursos . Nomeie o arquivo como ExceptionMessages.resx. Este é o arquivo de recursos padrão.
Adicione um par de nome/valor para sua mensagem de exceção, como mostra a imagem a seguir:
Adicione um novo arquivo de recurso para francês. Nomei-o como ExceptionMessages.fr-FR.resx.
Adicione um par de nome/valor para a mensagem de exceção novamente, mas com um valor em francês:
Depois de compilar o projeto, a pasta de saída de build deve conter a pasta fr-FR com um arquivo .dll, que é o assembly satélite.
Você lança a exceção com 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")
Observação
Se o nome do projeto for
TestProject
e o arquivo de recurso ExceptionMessages.resx residir na pasta Resources do projeto, o nome totalmente qualificado do arquivo de recurso seráTestProject.Resources.ExceptionMessages
.