Retornando erros entre camadas

Salve povo !

Até recentemente tenho usado muito as Exceptions para retornar erros entre as camadas das aplicações. Para mim aquilo estava ok, porém, lendo o livro Pragmatic Programmer há um tópico que diz: “use Exceptions para exceções. Nos demais casos retorne um erro normal”. Não estou certo de quão bem funcionaria isto, uma vez que a aplicação tem camadas e por este motivo eu precisaria ficar fazendo uso de return e avaliando as condições para saber o que aconteceu (se deu certo ou nao)

Rabiscando rapidamente:

[code]public Cliente add(Cliente cli) {
if (!cli.hasName()) {
return ‘Nome inválido’; // tudo bem que aqui não é lugar para validar, mas pula isso =~
}

 try {
     this.repositorio.salvaAqui(cli);
     return cli;
 } catch (ConnectionFoobarException coe) {
     // conexao FAIL. Isto sim é uma exceção oO'
 }

}
// … fim da classe e pá
[/code]

Imaginando assim penso que ficaria uma zona o código, pois caso sucesso recebo um Objeto, do contrário uma string além da “Exception” que possa a ter para tratar possíveis exceções :confused:

Alguém que tenha lido o livro ou visto algo sobre poderia discorrer sobre ?

Abraços !

eu também prefiro usar Exceptions sempre,
pelo q li em uma apostila de java básico da Caelum http://www.caelum.com.br/downloads/apostila/caelum-java-objetos-fj11.pdf
uma possibilidade é criar uma tabela de erros, e retornar um número mágico do erro, para indexar esta tabela
mas usar esses números mágicos , é considerado uma má prática.

O que usei muitas vezes foi por o objeto em Estado de Erro, e fazer com que ele guarde uma lista de mensagens de erro que as camadas superiores leem, assim eu nao preciso por valor de retorno nos metodos.

Mas com o tempo eu nao vi muita vantagem nessa abordagem tambem, acaba ficando chato de programar pra tao pouco ganho. Entao voltei as boas e velhas exceptions.

Julgo da seguinte forma: Se vou precisar da intervencao do usuario novamente para a mesma operação lanco uma excecao, por mais que seja só porque ele nao informou um campo obrigatorio, só torno a exibição da mensagem diferente de uma mensagem de erro da aplicacao.

Eu recomendo a leitura deste post escripto pelo Phillip Calçado em seu blog.

http://fragmental.tw/2008/12/04/layers-and-exceptions/