Olá. Vou mostrar como geralmente realizo o tratamento de exceções.
Tomemos um exemplo. Vamos supor que tenho a seguinte classe Usuario:
class Usuario {
private String login, senha;
// Getters e setters.
}
Agora tenho um service que faz o cadastro de um novo usuário usando um DAO:
class UsuarioService {
public void create(String login, String senha) {
Usuario usuario = new Usuario(login, senha);
usuarioDao.create(usuario);
}
}
E tenho um managed bean que contém um método que usa o service:
class UsuarioBean {
public void criarUsuario() {
usuarioService.create(login, senha);
}
}
Partindo do cenário acima, vamos supor que quero inserir a seguinte regra:
Os campos login e senha não podem ser vazios.
Vamos começar criando uma classe para representar erros de negócio, conforme sugerido pelo colega
FernandoFranzini:
class BusinessException extends RuntimeException {
public BusinessException(String message) {
super(message);
}
}
Reparem que a exceção herda de RuntimeException. Isso é para evitar que precisemos declarar throws Exception em cada método que trata essa exceção.
Agora vamos modificar a classe Usuario para validar nossa regra:
class Usuario {
private String login, senha;
public Usuario(String login, String senha) {
if (String.isEmpty(login) || String.isEmpty(senha)) {
throw new BusinessException("Campos requeridos não preenchidos.");
}
}
// Getters e setters.
}
Nosso service deve ser modificado agora para realizar esse tratamento, e propagar essa exceção para o managed bean. Se quisermos, podemos usar a idéia do colega
FernandoFranzini e criar também uma exceção para representar erros nos services. Afinal, aqui podem acontecer erros de vários tipos além de erros de negócio.
class ApplicationException extends RuntimeException {
public ApplicationException(Throwable cause) {
super(cause);
}
}
Observem que na exceção anterior estamos passando pro construtor da superclasse a
causa do erro. Isso é muito importante! Devemos sempre criar nossas exceções passando também a exceção que representa a causa.
Segue abaixo o service modificado:
class UsuarioService {
public void create(String login, String senha) {
try {
Usuario usuario = new Usuario(login, senha);
usuarioDao.create(usuario);
catch (BusinessException ex) {
throw new ApplicationException(ex);
}
}
}
Então, quando a exceção chegar no managed bean, fazemos o tratamento necessário:
class UsuarioBean {
public void criarUsuario() {
try {
usuarioService.create(login, senha);
} catch (ApplicationException ex) {
// Exibir mensagem de negócio para o usuário.
}
}
}