JavaWeb application

Spring Boot #22 – Jak poprawnie obsługiwać wyjątki

Spring Boot

Spring Boot dostarcza mechaniki pozwalające na wygoda obsługę wyjątków. Działają one zasadzie AOP. Jest to zalecany i wygodny sposób na oddzielenie kodu logiki biznesowej od kodu odpowiedzialnego za obsługę błędów.

Przykład

Rozpatrzmy sytuacje, gdzie mamy metodę webową, która po podaniu imienia wypisuje komunikat „Hello + imię”. Kiedy imię jest krótsze niż dwa znaki rzucamy wyjątek.

@GetMapping("/sayHello")
public String sayHello(@RequestParam String name) {
    if (name.length() <= 1) {
        throw new IllegalArgumentException();
    }
    return "Hello " + name;
}

W ciele ifa można umieścić obsługę wyjątku polegającą na zbudowaniu encji stanowiącej odpowiedź dla użytkownika, a także zalogować błąd. Jednak taka realizacja skutkowałaby zmienieniem czytelności kodu i złamaniem pierwszej zasady SOLID. Rozwiązaniem jest zaimplementowanie nowej klasy odpowiadającej za obsługę błędu

Implementacja

Jeśli błąd powoduje metoda webowa należy utworzyć nową klasę, która dziedziczyć będzie po ResponseEntityExceptionHandler.

Następnie należy utworzyć metodę, która będzie posiadała adnotacje @ExceptionHandler. Adnotacja ta daje możliwość przechwycenia wyjątku, zgodnego z argumentem jaki zostanie do niej przekazany.

Metoda może przyjmować dwa parametry. Pierwszy z nich to rodzaj błędu, a druga z nich to żądanie webowe. W zawartości metody można dokonać obsługi błędu – zalogować, utworzyć komunikat. Natomiast dzięki metodzie handleExceptionInternal dziedziczonej po ResponseEntityExceptionHandler można utworzyć spersonalizowaną odpowiedź dla użytkownika.

@ControllerAdvice
public class ErrorHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<Object> handleWebExeption(RuntimeException e, WebRequest webRequest) {
        String response = "Given name is too short";
        System.err.println(Arrays.toString(e.getStackTrace()));
        return handleExceptionInternal(e, response, HttpHeaders.EMPTY, HttpStatus.BAD_REQUEST, webRequest);
    }
}

Co dalej?

W następnej części artykułu przedstawię, jak utworzyć własne wyjątki oraz jak dokonywać ich obsługi.

Tags:
Show Buttons
Hide Buttons