Compartilhar via


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:

  1. 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
    
  2. 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
    
  3. 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:

  1. Crie uma nova pasta chamada Recursos para armazenar os arquivos de recurso.

  2. 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.

  3. Adicione um par de nome/valor para sua mensagem de exceção, como mostra a imagem a seguir:

    Adicionar recursos à cultura padrão

  4. Adicione um novo arquivo de recurso para francês. Nomei-o como ExceptionMessages.fr-FR.resx.

  5. Adicione um par de nome/valor para a mensagem de exceção novamente, mas com um valor em francês:

    Adicione recursos à cultura fr-FR

  6. 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.

  7. 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.

Confira também