Skip to content

Instantly share code, notes, and snippets.

@rafarocha
Last active August 29, 2015 14:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rafarocha/ffd7837c45d27202b123 to your computer and use it in GitHub Desktop.
Save rafarocha/ffd7837c45d27202b123 to your computer and use it in GitHub Desktop.
Tratabilidade de exceções no cliente
Imagine uma tela de busca de produtos por faixa de preço através da consulta a um serviço REST
Deseja-se que o cliente possa formatar a mensagem e enviar para o usuário
Digamos que a chamada getProdutos na linha 10 retorne http status code 422 e no body a mensagem
{ "token":"1N1H2TT014102023424","errors":["FAIXA_PRECO_INVALIDA","NAO_PERMITIDO_VALOR_NEGATIVO"] }
Entenda que usualmente o http status code 422 indica que houve um problema semântico na entidade
Um ClientException significa que algum problema ocorreu no request, seja de infra ou de negócio
A idéia é que o cliente informe um properties que inclua a sua própria mensagem
FAIXA_PRECO_INVALIDA = A faixa de preço está inválida cowboy!
Em estudo:
- Mensagens formatadas com parâmetros
- Customizar em apenas uma mensagem
----------------
// caso simples
try {
Client client = new ClientImpl( getConfiguration(), getBusinessMessage() );
List<Produto> produtos = client.getProdutos( faixaPreco(-100, 200) );
} catch( ClientException exception ) {
if ( exception.isCausedByUnprocessableEntity() ) { // ocorre quando http status code for 422
throw new BusinessException( exception.getFormattedErrorMessages() ); // List<String>
}
throw InfraException("deu bronca geral");
}
// caso mensagem parametrizada
// em estudo ...
----------------
// comportamento interno do client
if ( responseCode == UNPROCESSABLE_ENTITY == 422 ) {
// registrar em log informações
UnprocessableEntityException uee = new UnprocessableEntityException( errors );
throw new ClientException("problema semântico entidade", uee, responseCode);
}
class UnprocessableEntityException {
private List<String> errors;
public UnprocessableEntity(List<String> errors) {
this.errors = errors;
}
public List<String> getErrors() {
return errors;
}
}
public class ClientException extends Exception {
private int statusCode = -1;
private boolean causedByUnprocessableEntity = false;
// outros atributos
public ClientException(String message, Throwable cause, int statusCode) {
this(message, cause);
this.statusCode = statusCode;
if( cause instanceof UnprocessableEntityException ) {
if( statusCode != UNPROCESSABLE_ENTITY ) { // UNPROCESSABLE_ENTITY == 422
throw new IllegalArgumentException("causa diferente do statuscode.");
}
this.causedByUnprocessableEntity = true;
}
}
public boolean isCausedByUnprocessableEntity() {
return causedByUnprocessableEntity;
}
}
@rafarocha
Copy link
Author

A mensagem pode vir formatada, mas pode ser que o cliente deseje enviar uma própria

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment