CS2031:

Desarrollo Basado en Plataformas

Semana 05: Error Handling

Contenido

  • Error Handling:
    • Excepciones Web vs. Excepciones de Dominio
  • @ResponseStatus
  • ResponseStatusException
  • @ExceptionHandler & 
  • Overview Exception Handling @ Spring
  • Actividad 02

Excepciones

En una típica división de código en las capas de controller, service & repository.

¿Quién es el responsable?

Responsabilidad

Extracción de una cuenta de banco con saldo negativo

No se respeta una regla de negocio entre 2 instancias de un modelo

Se produce un timeout contra otro servidor por fallo de red

No se pudo realizar un INSERT de mi entidad con un ID ya existente en la base de datos

Responsabilidad

Error al adquirir la conexión contra la base de datos

Recibimos un atributo que no posee nuestra entidad (*)

Nos envían un JSON mal formado

¿División por cero? ¿Objeto Nulo? ¿Intentar hacer comparaciones de valores entre 2 objetos donde uno es nulo?

Tipos de Errores en Java

Gestión de Errores en Spring

@ResponseStatus

Podemos crear excepciones anotadas, para que al tirarlas desde un controller, se retorne el status code HTTP que pasemos por parámetro:

 

@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Song not found")
public class SongNotFoundException extends RuntimeException {

}

Gestión de Errores en Spring

@ResponseStatusException

Es una alternativa a @ResponseStatus. Al realizar el throw de esta clase, se corta el flujo de nuestra app.

 

@GetMapping("/song/{id}")
public Song getSong(@PathVariable("id") Long id) {
	try {
		return songService.getSong(id);
	} catch (SongNotFoundException exception) {
		throw new ResponseStatusException(HttpStatus.NOT_FOUND,
        	"Song Not Found", exception);
	}
}

En este caso, además, estamos mapeando una excepción de dominio (SongNotFoundException) a una excepción del controller (404 NOT FOUND).

Gestión de Errores en Spring

@ExceptionHandler

Esta annotation nos permite referir a excepciones desde otras capas:

 

@ExceptionHandler(SongNotFound.class)
public void conflict() {
	throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Song Not Found");
}

La desventaja  es que solo funciona para un controller (*)

Gestión de Errores en Spring

@ExceptionHandler

Esta annotation nos permite referir a excepciones desde otras capas:

 

@ExceptionHandler(SongNotFound.class)
public ResponseEntity<String> conflict() {
	return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Ocurrió un error");
}

La desventaja  es que solo funciona para un controller (*)

Gestión de Errores en Spring

@RestControllerAdvice

Permite centralizar uno o más @ExceptionHandler en una misma clase.

 

@RestControllerAdvice
public class PersonaExceptionHandler {
    @ExceptionHandler(value = {PersonaNameBad.class})
    protected ResponseEntity<ErrorMessage> handleConflict(RuntimeException ex) {
        return ResponseEntity
        	.status(HttpStatus.NOT_ACCEPTABLE)
            .body(new ErrorMessage("Bad Code", HttpStatus.NOT_ACCEPTABLE.toString()));
    }
}

¿Gestión de Errores en Spring?

Actividad

Implemente 2 excepciones en los siguientes métodos:

 

- Búsqueda de una canción por identificador.

- Otro método implementado en el Lab 2.01

 

References

Made with Slides.com