Try-Catch não captura

Boa tarde Senhores,

Estou com um problema que parece até já ser conhecido da comunidade, mas embora tenha encontrado várias pessoas com o problema, nenhuma apresentou a solução que encontrou…

Tenho um saveOrUpdate em um DAO, que está retornando uma exception (propositalmente pra tentar solucionar o problema), lançada por violação de campo unique.

Porém embora eu tenha colocado o código em um bloco try-catch, o catch não está capturando e acabo recebendo a mensagem de erro inteira, não tratada no console…

Estou usando Exception, mas já tentei com HibernateException e afins também…

Estou usando JBOSS…

Alguém tem uma luz?

E a exception está sendo lançado de dentro do try catch?

Verifique a exceção que está ocorrendo e coloque um catch para ela.

para tratar qualquer exceção você deve tratar Throwable

nem todas as exceções são tratadas com um catch para Exception algumas, as que são filhas de RuntimeException devem ser tratadas com Essa mesma esxceção filha de RuntimeException ou com alguma classe na sua estrutura de herança (menos Exception).

Pesquise por exceções não verificadas no java.

Oi? Como assim? Você pode mostrar um exemplo disso? porque nunca ouvi falar de tal coisa.

@Rodrigo

Depois de invocar saveOrUpdate dê um flush no seu objeto gerenciador (Session, EntityManager ou qualquer outro), veja se assim ele captura a exceção

[quote=Rodrigo Sasaki][quote=maior_abandonado]Verifique a exceção que está ocorrendo e coloque um catch para ela.

para tratar qualquer exceção você deve tratar Throwable

nem todas as exceções são tratadas com um catch para Exception algumas, as que são filhas de RuntimeException devem ser tratadas com Essa mesma esxceção filha de RuntimeException ou com alguma classe na sua estrutura de herança (menos Exception).

Pesquise por exceções não verificadas no java.[/quote]
Oi? Como assim? Você pode mostrar um exemplo disso? porque nunca ouvi falar de tal coisa.

@Rodrigo

Depois de invocar saveOrUpdate dê um flush no seu objeto gerenciador (Session, EntityManager ou qualquer outro), veja se assim ele captura a exceção[/quote]Até hoje só vi hibernate jogar runtime exception. Nunca vi throwable ñ…

Se você tratar Throwable pode acabar capturando um Error também, o que indica que estão
ocorrendo sérios problemas na sua aplicação (como falta de memória) e não deve ser tratado.

[quote=Hebert Coelho][quote=Rodrigo Sasaki][quote=maior_abandonado]Verifique a exceção que está ocorrendo e coloque um catch para ela.

para tratar qualquer exceção você deve tratar Throwable

nem todas as exceções são tratadas com um catch para Exception algumas, as que são filhas de RuntimeException devem ser tratadas com Essa mesma esxceção filha de RuntimeException ou com alguma classe na sua estrutura de herança (menos Exception).

Pesquise por exceções não verificadas no java.[/quote]
Oi? Como assim? Você pode mostrar um exemplo disso? porque nunca ouvi falar de tal coisa.

@Rodrigo

Depois de invocar saveOrUpdate dê um flush no seu objeto gerenciador (Session, EntityManager ou qualquer outro), veja se assim ele captura a exceção[/quote]Até hoje só vi hibernate jogar runtime exception. Nunca vi throwable ñ…[/quote]

Sim, mas é a melhor forma de você saber o que está acontecendo… imaginem um cenário onde você quer saber do erro independente do que esteja acontecendo, se der qualquer tipo de erro você quer logar ele e depois deixar a exceção acontecer, ou então uma situação que eu inclusive acho o melhor tratamento, você põe um catch para as exceções que você espera que possa acontecer, e um throwable para algo inesperado, logando o problema, opcionalmente usando algum tratamento variavel de acordo com a regra de negócio, dar rollback manual na transação se for o caso, enfim, e opcionalmente lançando essa exceção para cima, de forma que as camadas superiores saibam que algo deu errado, exemplo:

try{
	//qualquer coisa de io
catch (FileNotFoundException e) {
	//logar
	//qualquer outra coisa que você queira
}
catch (IOException e) {
	//logar
	//qualquer outra coisa que você queira
}
catch (QualquerOutraExcecaoQueVoceQuiser e) {
	//logar
	//qualquer outra coisa que você queira
}catch (Throwable e) {
	//logar erros gerais
	//qualquer outra coisa que você queira
	throw new RuntimeException("erro inesperado", e);
}

percebam que isso evita a situação do criador do tópico, onde você sabe que deu algum problema, mas não sabe de mais nada…

editando até para acrescentar informação, eu acho que HibernateException deveria ser uma exceção verificada (até por que SQLException é e da mesma forma você pode fazer uma HQL com erros por exemplo, você pode ter problemas semelhantes) considerando que as não verificadas são coisas que o programador deveria cuidar para não acontecer (NullPointerException, AritmeticException…)…

[quote=natanaelv]Se você tratar Throwable pode acabar capturando um Error também, o que indica que estão
ocorrendo sérios problemas na sua aplicação (como falta de memória) e não deve ser tratado.[/quote]

mesmo que o problema que tenha dado seja um Error, eu ainda quero ficar sabendo disso e ver o log, nesse caso especialmente, quanto mais informações do cenário melhor… se for falta de memória em uma aplicação web por exemplo eu posso querer ver o que tem na sessão do usuário ou algo do tipo… lance a exceção depois, mas logue o problema…

[quote=maior_abandonado]
percebam que isso evita a situação do criador do tópico, onde você sabe que deu algum problema, mas não sabe de mais nada…

editando até para acrescentar informação, eu acho que HibernateException deveria ser uma exceção verificada (até por que SQLException é e da mesma forma você pode fazer uma HQL com erros por exemplo, você pode ter problemas semelhantes) considerando que as não verificadas são coisas que o programador deveria cuidar para não acontecer (NullPointerException, AritmeticException…)…

e mesmo que o problema que tenha dado seja um Error, eu ainda quero ficar sabendo disso e ver o log, nesse caso especialmente, quanto mais informações do cenário melhor…[/quote]
Não! - Isso não resolve o problema dele!

Só por que a pessoa chamou o método persist ou saveOrUpdate dentro de um try/catch não quer dizer que ali estourará o erro.
Esse é o problema dele e a solução foi a que o Rodrigo Sasaki passou.