Criar uma exceção personalizada em Java

Criar uma exceção personalizada em Java

1. Introdução

Neste tutorial, vamos cobrirhow to create a custom exception in Java.

Mostraremos como as exceções definidas pelo usuário são implementadas e usadas para as exceções verificadas e não verificadas.

2. A necessidade de exceções personalizadas

As exceções de Java abrangem quase todas as exceções gerais que provavelmente ocorrerão na programação.

No entanto, às vezes precisamos complementar essas exceções padrão com as nossas.

Os principais motivos para a introdução de exceções personalizadas são:

  • Exceções da lógica de negócios - Exceções específicas à lógica de negócios e ao fluxo de trabalho. Isso ajuda os usuários do aplicativo ou os desenvolvedores a entender qual é o problema exato

  • Para capturar e fornecer tratamento específico a um subconjunto de exceções Java existentes

As exceções de Java podem ser verificadas e desmarcadas. Nas próximas seções, cobriremos esses dois casos.

3. Exceção verificada personalizada

Exceções verificadas são exceções que precisam ser tratadas explicitamente.

Vamos considerar um pedaço de código que retorna a primeira linha do arquivo:

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine()) return file.nextLine();
} catch(FileNotFoundException e) {
    // Logging, etc
}

O código acima é uma maneira clássica de lidar com exceções verificadas por Java. Embora o código lanceFileNotFoundException,, não está claro qual é a causa exata - se o arquivo não existe ou o nome do arquivo é inválido.

Para criar uma exceção personalizada, temos que estender a classejava.lang.Exception.

Vejamos um exemplo disso criando uma exceção personalizada marcada chamadaIncorrectFileNameException:

public class IncorrectFileNameException extends Exception {
    public IncorrectFileNameException(String errorMessage) {
        super(errorMessage);
    }
}

Observe que também temos que fornecer um construtor que recebeString como mensagem de erro e é chamado de construtor da classe pai.

Isso é tudo que precisamos fazer para definir uma exceção personalizada.

A seguir, vamos ver como podemos usar a exceção personalizada em nosso exemplo:

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine())
        return file.nextLine();
} catch (FileNotFoundException e) {
    if (!isCorrectFileName(fileName)) {
        throw new IncorrectFileNameException("Incorrect filename : " + fileName );
    }
    //...
}

Nós criamos e usamos uma exceção personalizada, então o usuário agora pode saber qual é a exceção exata. Isso é suficiente? Consequentemente, somoslosing the root cause of the exception.

Para corrigir isso, também podemos adicionar um parâmetrojava.lang.Throwable ao construtor. Dessa forma, podemos passar a exceção raiz para a chamada do método:

public IncorrectFileNameException(String errorMessage, Throwable err) {
    super(errorMessage, err);
}

Agora, oIncorrectFileNameException é usado junto com a causa raiz da exceção como esta:

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine()) {
        return file.nextLine();
    }
} catch (FileNotFoundException err) {
    if (!isCorrectFileName(fileName)) {
        throw new IncorrectFileNameException(
          "Incorrect filename : " + fileName , err);
    }
    // ...
}

É assim que podemos usar exceções personalizadaswithout losing the root cause from which they occurred.

4. Exceção desmarcada personalizada

Em nosso mesmo exemplo, vamos supor que precisamos de uma exceção personalizada se o nome do arquivo não contém nenhuma extensão.

Nesse caso, precisaremos de uma exceção desmarcada personalizada semelhante à anterior, pois esse erro só será detectado durante o tempo de execução.

To create a custom unchecked exception we need to extend the java.lang.RuntimeException class:

public class IncorrectFileExtensionException
  extends RuntimeException {
    public IncorrectFileExtensionException(String errorMessage, Throwable err) {
        super(errorMessage, err);
    }
}

Portanto, podemos usar esta exceção desmarcada personalizada em nosso exemplo:

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine()) {
        return file.nextLine();
    } else {
        throw new IllegalArgumentException("Non readable file");
    }
} catch (FileNotFoundException err) {
    if (!isCorrectFileName(fileName)) {
        throw new IncorrectFileNameException(
          "Incorrect filename : " + fileName , err);
    }

    //...
} catch(IllegalArgumentException err) {
    if(!containsExtension(fileName)) {
        throw new IncorrectFileExtensionException(
          "Filename does not contain extension : " + fileName, err);
    }

    //...
}

5. Conclusão

Exceções personalizadas são muito úteis quando precisamos lidar com exceções específicas relacionadas à lógica de negócios. Quando usados ​​corretamente, eles podem servir como uma ferramenta útil para melhor manipulação e registro de exceções.

O código para os exemplos usados ​​neste artigo está disponívelover on Github.