E você pode me dizer onde que você está se recuperando do erro? Usar exceptions verificados e ainda por cima simplesmente para logar o erro não me parece uma boa estratégia por tudo que já foi debatido neste tópico.
Quem falou em usar exceptions verificadas só para logar erro ?? …
A questão ate onde entendo é que vc deve no limite da camada, mostrar para quem vá usa-la que ela lança exceções, e que o usuario deve estar ciente destas exceções, e trata-los como achar conviniente… caso não seja capaz de tratar, basta avisar com um throws, ou usando o padrão handle, convertendo a exceção gerada na camada de baixo, em uma desta camada, de forma que a proxima camada de cima, não precise conhecer a que esta abaixo desta…
Por exemplo, o meu start do banco, que cria o SessionFactory do Hibernate é um método que lança exceção verificada, isso se justifica, pois existe N possiveis casos onde isso pode gerar exceções, o banco pode não estar instalado na maquina, pode não haver conexão com a internet ou intranet para conectar com o banco, pode ocorrer N coisas, portanto tenho um exceção verificada nesse ponto… assim eu monto minha session factory explicitamente, através de uma chamada, que lança exceções… faço verificado nesse ponto, por acreditar que mesmo fazendo tudo certo dentro do programa, um fator totalmente externo (como uma desconexão com a internet) pode ocasionar em problemas aqui…
Os repositorios por sua vez, que utilizam a conexão do hibernate e o sessionfactory, caso a sessionFactory não esteja presente, eu não lanço exceções verificadas, pois acho q isso poluiria de verdade o código, faço um tratamento e lanço Runtimes, acredito que a conexão que foi feita de modo explicito anteriormente e com a exceção verificada, vai fazer um correto tratamento, posteriormente lembranco apenas que a exceção pode surgir, mais q não precisa ser verificada…
Eu tento tomar bastante cuidado, ao lançar as exceções verificadas, acredito que o melhor momento pra faze-lo é quando mesmo que vc esteja fazendo tudo direito, mesmo assim algo pode dar errado, por motivos externos, Um banco de dados desligado, um arquivo que deveria estar em um lugar e não esta… etc etc etc…
…
No exemplo do post acima, modelando uma entidade, não faço verificado, pois acredito que o erro seja realmente RunTime, não ha motivos de obrigar a fazer um try{}catch(){} em um set da entidade, o parametro estar dentro das especificações é algo q eu posso controlar antes de mandar o valor para entidade, portanto posso ter 100% de garantia que o valor q mando pra entidade é conforme…
já na hora de salvar uma entidade, por exemplo, não tenho como ter 100% de certeza que consigo salvar a entidade, não tenho como ter 100% de certeza que não vou esbarrar num CONSTRAINT de algum campo UNIQUE por exemplo, e nessa hora, mesmo eu fazendo tudo certo algo pode dar errado… por isso… Repositories.save(entity); gera exceções verificadas… assim acredito estar fazendo certo…
com findAll(), findById(id), findByNome()…, deletes(), por exemplo, não faço verificado, pois se eu garantir que os dados que estou mandando estão corretamente, o erro so vem, se a conexão com o banco estiver ausente, o que trato la no inicio, na hora de start o programa…
enfim… assim tenho exceções verificadas, e não verificadas…
Edit.: Não acho correto por exemplo, ao fazer um Repositories.save(clienteJoao); receber uma SQLException, apenas com uma mensagem “Constraint Violation Unique Key bla bla bla…” … como programando la no controle entre a view e o modelo, vou conseguir tratar um erro desse ??, tenho que dentro do repositorio conseguir entender o que é esse erro que o hibernate gera, que é gerado por conta de um erro do SQL, e tenho que tratalo, devo mastigar o erro, posi ali que estou programado com a camada de persistencia, ali eu tenho que fazer isso virar legivel, de forma que daqui, saia algo como ConstraintViolationException que contenhas informações como, a referencia a entidade que continha o valor que gerou a exceção (a partir dela da pra pegar o nome da entidade, ou ate mesmo recuperar os dados da entidade, mostrar de volta par a view, e pedir que seja alterado o compo onde há a violação), valor que não foi permitido (se possivel com o nome da propriedade, assim podendo especificar para a view o que o meu usuario deve mudar, para poder salvar o registro), o valor que era esperado, e outras coisas, que seja util, e de facil interpretação para que o controle, através de um try{}catch(){} obrigatoriamente verificado, possa tratar, e repassar o erro para a view, com algo elegante como:
Verificamos que o CPF : [CPF removido] já existe em nosso banco, cadastrado para o senhor “Fulano de tal”, assim não foi possível cadastrar o Senhor “Beltrano da Silva” sobre o mesmo número de CPF, o que deseja fazer ? carregar os dados de “Beltrano da silva”? Salvar as novas informações digitadas para “Fulano de tal” por cima dos dados de “Beltrano da silva” ?
enfim essas coisas eu posso verificar, no momento da exceção, por gerar uma Exception rica em informação, para melhroar o tratamento