# Exception-Handling

Natürlich können bei der Bearbeitung von API-Anfragen auch Fehler auftreten. Um nun nicht in jede Methode immer wieder denselben Code zur Fehlerbehandlung einbauen zu müssen, bietet es sich an, dies an zentraler Stelle zu tun. Hierfür gibt es die Annotation @RestControllerAdvice. In einer Klasse, die damit markiert ist, können @ExceptionHandler Methoden erstellt werden.

Um den HTTP-Status der Response zu setzen, kann @ResponseStatus verwendet werden. Der Rückgabewert der Methode wird, wie bei @RestController an den Client gesendet.

Jede dieser Methoden definiert, bei welcher Exception sie aufgerufen werden soll (entspricht dem Methodenparameter). Es können generelle sowie spezialisierte Methoden definiert werden, d. h. dass es beispielsweise eine Methode geben kann, die sich um Exception kümmert und eine, die sich um eine spezielle, von Exception abgeleitete Exception kümmert. Spring sucht dann die spezifischste Methode heraus.

Es ist so auch möglich eine eigene Exception-Struktur aufzubauen. Unpassende Exceptions werden von Spring behandelt.

open class ApiException(message: String) : Exception(message)
class NotFoundApiException(message: String) : ApiException(message)

@RestControllerAdvice
class ExceptionHandling {
  @ExceptionHandler
  @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
  fun handleApiException(ex: ApiException) = ErrorResponse(ex.message)

  @ExceptionHandler
  @ResponseStatus(HttpStatus.NOT_FOUND)
  fun handleNotFound(ex: NotFoundApiException) = handleApiException(ex)
}