Manipulador de exceção global Java

Manipulador de exceção global Java

1. Visão geral

Neste tutorial, vamos nos concentrar no Global Exception Handler em Java. Discutiremos primeiro os fundamentos das exceções e o tratamento de exceções. Em seguida, teremos uma visão abrangente do manipulador de exceção global.

Para aprender mais sobre as exceções em geral, dê uma olhada emException Handling in Java.

2. O que é uma exceção?

An exception is an abnormal condition that arises in a code sequence at runtime or at compile time. Esta condição anormal surge quando um programa viola as restrições semânticas da linguagem de programação Java.

Exceptions that occur during the compile time are checked exceptions. Essas exceções são subclasses diretas da classeException e é necessário lidar com essas exceções no código.

Another type of exceptions are the unchecked exceptions. The compiler does not check for these exceptions during the compile time. Essas exceções são subclasses diretas da classeRuntimeException que estende a classeException.

Além disso, não é necessário lidar com exceções de tempo de execução no código.

3. Manipuladores de exceção

Java é uma linguagem de programação robusta. Um dos principais recursos que o torna robusto é a estrutura de tratamento de exceções. Isso significa que o programa pode sair normalmente no momento do erro, em vez de apenas travar.

Whenever an exception occurs, an Exception object is constructed, pela JVM ou pelo método de execução do código. Este objeto contém as informações sobre a exceção. Exception handling is a way of handling this Exception object.

3.1. O blocotry-catch

No exemplo a seguir, o blocotry contém o código que pode lançar uma exceção. O blococatch contém a lógica para tratar esta exceção.

O blococatch captura o objetoException que o código no blocotry gera:

String string = "01, , 2010";
DateFormat format = new SimpleDateFormat("MM, dd, yyyy");
Date date;
try {
    date = format.parse(string);
} catch (ParseException e) {
    System.out.println("ParseException caught!");
}

3.2. As palavras-chavethrow ethrows

Como alternativa, o método também pode optar por lançar a exceção em vez de manipulá-la. Isso significa que a lógica para lidar com o objetoException está escrita em outro lugar.

Geralmente, o método de chamada lida com a exceção nesses casos:

public class ExceptionHandler {

    public static void main(String[] args) {

        String strDate = "01, , 2010";
        String dateFormat = "MM, dd, yyyy";

        try {
            Date date = new DateParser().getParsedDate(strDate, dateFormat);
        } catch (ParseException e) {
            System.out.println("The calling method caught ParseException!");
        }
    }
}

class DateParser {

    public Date getParsedDate(String strDate, String dateFormat) throws ParseException {
        DateFormat format = new SimpleDateFormat(dateFormat);

        try {
            return format.parse(strDate);
        } catch (ParseException parseException) {
            throw parseException;
        }
    }

}

A seguir, vamos considerar o Global Exception Handler, como uma forma genérica de lidar com exceções.

4. Manipulador de exceção global

As instâncias deRuntimeException são opcionais para tratamento. Consequentemente, ele ainda deixa uma janela aberta para obter os rastreamentos longos da pilha em tempo de execução. Para lidar com isso,Java provides the UncaughtExceptionHandler interface. A classeThread contém isso como uma classe interna.

Além dessa interface,Java 1.5 release also introduced a static method setDefaultUncaughtExceptionHandler() in the Thread class. O argumento deste método é uma classe de manipulador que implementa a interfaceUncaughtExceptionHandler.

Além disso, essa interface declara o métodouncaughtException(Thread t, Throwable e). Ele será chamado quando um determinado encadeamentot terminar devido à determinada exceção não capturadae. A classe de implementação implementa esse método e define a lógica para lidar com essas exceções não capturadas.

Vamos considerar o seguinte exemplo que lança umArithmeticException em tempo de execução. Definimos a classeHandler que implementa a interfaceUncaughtExceptionHandler.

Esta classe implementa o métodouncaughtException() e define a lógica para lidar com exceções não detectadas nele:

public class GlobalExceptionHandler {

    public static void main(String[] args) {

        Handler globalExceptionHandler = new Handler();
        Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler);
        new GlobalExceptionHandler().performArithmeticOperation(10, 0);
    }

    public int performArithmeticOperation(int num1, int num2) {
        return num1/num2;
    }
}

class Handler implements Thread.UncaughtExceptionHandler {

    private static Logger LOGGER = LoggerFactory.getLogger(Handler.class);

    public void uncaughtException(Thread t, Throwable e) {
        LOGGER.info("Unhandled exception caught!");
    }
}

Aqui, o segmento em execução no momento é o principal. Portanto, sua instância é passada para o métodouncaughtException() junto com a exceção levantada. A classeHandler então trata essa exceção.

O mesmo se aplica às exceções verificadas não tratadas. Vejamos um exemplo rápido disso também:

public static void main(String[] args) throws Exception {
    Handler globalExceptionHandler = new Handler();
    Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler);
    Path file = Paths.get("");
    Files.delete(file);
}

Aqui, o métodoFiles.delete() lança umIOException, verificado, que é posteriormente lançado pela assinatura do métodomain(). OHandler capturará essa exceção também.

Desta forma, oUncaughtExceptionHandler ajuda no gerenciamento de exceções não tratadas em tempo de execução. No entanto, ébreaks the idea of catching and handling the exception close to the point of origin.

5. Conclusão

Neste artigo, levamos um tempo para entender quais são as exceções e quais são as maneiras básicas de lidar com elas. Além disso, identificamos que o manipulador de exceção global é parte da classeThread e trata as exceções de tempo de execução não capturadas.

Em seguida, vimos um programa de exemplo que lança uma exceção de tempo de execução e lida com ele usando um manipulador de exceção global.

Os códigos de exemplo para este artigo podem ser encontradosover on GitHub.