W poprzednim artykule opisywałem jak poprawnie obsługiwać wyjątki. W tej części zaprezentuje w jaki sposób definiować własne wyjątki.
W celu zdefiniowania nowego wyjątku należy utworzyć nową klasę, która będzie dziedziczyć po Exception. Dobrą praktyką jest dodanie w nazwie sufixu Exception.
Przykład
W tym przykładzie zostanie stworzony wyjątek, który wyświetla stosowny komunikat w przypadku kiedy podane imię jest zbyt krótkie.
Klasa wyjątku powinna dziedziczyć po Exception, ale można wybrać też mniej ogólny typ. W moim przypadku będzie to RuntimeException.
public class IncorrectNameException extends RuntimeException { private static final String EXCEPTION_MESSAGE = "The provided name is too short"; public IncorrectNameException() { super(EXCEPTION_MESSAGE); } }
Samo rzucenie wyjątku, niczym się nie różni od rzucania innych wyjątków:
@RestController public class ExampleApi { @GetMapping("/sayHello") public String sayHello(@RequestParam String name) { if (name.length() <= 1) { throw new IncorrectNameException(); } return "Hello " + name; } }
Największa korzyścią jest możliwość przejmowania i dowolnego obsługiwania tych rodzajów wyjątków, które nas interesują.
@ControllerAdvice public class ErrorHandler extends ResponseEntityExceptionHandler { @ExceptionHandler(IncorrectNameException.class) public ResponseEntity<Object> handleWebExeption(IncorrectNameException e, WebRequest webRequest) { System.err.println(Arrays.toString(e.getStackTrace())); return handleExceptionInternal(e, e.getMessage(), HttpHeaders.EMPTY, HttpStatus.BAD_REQUEST, webRequest); } }
Projekt znajdziesz na GitHubie:
https://github.com/bykowski/springboot-errorhandling