Durante lo sviluppo di una piccola API Web, abbiamo deciso di separare le eccezioni interne dalle eccezioni pubbliche. Le eccezioni pubbliche sono eccezioni HTTP, che si traducono in risposte HTTP con codice di stato appropriato (ad esempio BadRequestHttpException
, NotFoundHttpException
, ecc.). Le eccezioni interne sono eccezioni generate dagli adattatori nel nostro sistema (livello cache, livello di persistenza, ecc.) O nel dominio ( InvalidUserException
, BadPasswordException
, ecc.).
Questo è stato grandioso finora. Tuttavia, i nostri controllori stanno iniziando a sentire un cattivo odore:
try {
securityService.login(credentials);
} catch (InvalidOAuthProviderException e) {
throw new BadRequestHttpException(e.getMessage(), e.getCode());
} catch (UserNotFoundException e) {
throw new NotFoundHttpException(e.getMessage(), e.getCode());
} catch (InactiveUserException e) {
throw new NotFoundHttpException(e.getMessage(), e.getCode());
} catch (InvalidOAuthTokenException e) {
throw new ForbiddenHttpException(e.getMessage(), e.getCode());
}
La firma del costruttore HttpException
è il messaggio di errore e il codice. Ciò comporterà un corpo JSON: {"message":"","code":222}
. Il codice è il codice di errore univoco per il riferimento del documento. Il codice HTTP della risposta effettiva è definito dal tipo di eccezione.
Questo non è chiaramente un buon segno e sono sicuro che c'è qualcosa di sbagliato nel design qui. Qualsiasi aiuto?