[RESOLVIDO] Pegar TODA a mensagem de erro com try/catch

16 respostas
mateusviccari

E aí pessoal, to querendo saber como se pega TODA a mensagem de erro usando o try/catch, pra tratar esta mensagem e dizer pro cliente o que ta dando errado.

Eu tentei usar o RollbackException no bloco catch e usando o método getMessage pra pegar a mensagem de erro porém a unica coisa que ele retornou foi um “Error while commiting the transaction”, eu ueria pegar toda a mensagem, ou pelo menos a parte onde diz “Detalhe: Chave (ie)=([telefone removido]) já existe

No caso, o erro que eu tenho é o seguinte(é bem grandinho):

Exception in thread "AWT-EventQueue-0" javax.persistence.RollbackException: Error while commiting the transaction at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71) at telas.FormCadastroFornecedor.SalvarActionPerformed(FormCadastroFornecedor.java:540) at telas.FormCadastroFornecedor.access$1100(FormCadastroFornecedor.java:30) at telas.FormCadastroFornecedor$12.actionPerformed(FormCadastroFornecedor.java:321) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6267) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6032) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4630) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2478) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [beans.Fornecedor] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2267) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660) at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54) ... 28 more Caused by: org.postgresql.util.PSQLException: ERRO: duplicar valor da chave viola a restrição de unicidade "fornecedor_ie_key" Detalhe: Chave (ie)=([telefone removido]) já existe. at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:304) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2250) ... 39 more

16 Respostas

nel

Oi!

De que forma está tratando a exceção? Como a está lançando inicialmente?
Mostre seu código, fica mais fácil ajuda-lo :slight_smile:

Abraços.

mateusviccari

Olá, obrigado pelo interesse.
Segue meu bloco try/catch:

try{
                // TODO add your handling code here:
                // 1 - pegar o objeto selecionado
                Fornecedor p = list1.get(linha);
                // 2 - perseestir o objeto no banco de dados
                entityManager1.getTransaction().begin();
                entityManager1.merge(p);
                entityManager1.getTransaction().commit();
                // 3 - atualizar o resultado da consulta
                list1.clear();
                list1.addAll(query1.getResultList());
                Salvar.setEnabled(false);

                int numero = list1.size()-1;
                Tabela.setRowSelectionInterval(numero, numero);
            }catch (RollbackException e){
                System.out.println(e.getMessage());
                JOptionPane.showMessageDialog(null, "Inscrição estadual ou CNPJ já existem!\nVerifique os dados digitados e faça as devidas correções.");
                entityManager1.clear();
                list1.clear();
                list1.addAll(query1.getResultList());
                try{
                    Tabela.setRowSelectionInterval(linha, linha);
                }catch (Exception ex){
                    Salvar.setEnabled(false);
                }
            }

Como você pode ver, gostaria de tratar essa excessão pra dizer pro usuário EXATAMENTE QUAL dos 2, Inscrição estadual ou CNPJ está errado.

nel

Oi!

Já tentou usar o catch com uma SQLException?

mateusviccari

Já tentei sim, só que dá aquele erro:
exception java.sql.SQLException is never thrown in body of corresponding try statement

java_es_a_lei

tento usar exception essa é para pegar todas

try {
            
        } catch (SQLException e) {
            
        }catch (Exception e) {
            
        }
mateusviccari

Pois é mas quando eu boto o SQLException ele da aquele erro que eu falei antes:
exception java.sql.SQLException is never thrown in body of corresponding try statement

Deve ter algum jeito de pegar toda a mensagem de erro só não to descobrindo como…

java_es_a_lei

Então acho que se vc lançar uma exception ja resolve

sobre o erro do SQlException ele ta falando que o corpo do seu codigo que ta no try/catch nunca vai lançar uma SQlException

mateusviccari

Pois é, por isso não usei o SQLException.

Quanto a usar somente Exception, o método getMessage me retorna SOMENTE isso aqui:
Error while commiting the transaction

Ou tem algum outro metodo que retorne a mensagem inteira?

nel

mateusviccari:
Pois é, por isso não usei o SQLException.

Quanto a usar somente Exception, o método getMessage me retorna SOMENTE isso aqui:
Error while commiting the transaction

Ou tem algum outro metodo que retorne a mensagem inteira?

Oi!
Tenta dar e.getCause().getMessage(); algo assim.

Abraços.

mateusviccari

O getCause.getMessage retorna isso aqui:

org.hibernate.exception.ConstraintViolationException: could not update: [beans.Fornecedor#7]

Tentei usar somente getCause e deu a mesma coisa.

Tá dificil rsrsrs

java_es_a_lei

não tem como vc verificar se ja existe no banco antes de fazer o commit

ai vc lança um throw

if (ja existe no banco ) { throw new Exception("Aqui a mensagem que quer mostrar "); }

mateusviccari

aeeee consegui.

usei o getCause DENTRO do getCause:

System.out.println(e.getCause().getCause());

Assim ele me retornou o que eu queria:
org.postgresql.util.PSQLException: ERRO: duplicar valor da chave viola a restrição de unicidade “fornecedor_ie_key”
Detalhe: Chave (ie)=(11111111) já existe.

Obrigado a todos pela ajuda.

java_es_a_lei

ou faz algo do tipo

try{

}catch (Exception ex) {			
			if (verifica transação) {
				throw new Exception ("Mensagem");
			} else {				
				throw new Exception (ex);
			}
}
java_es_a_lei

mateusviccari

coloca no titulo como [resolvido]

mateusviccari

Feito.

marcelohd02

Blz Me Ajudou Muito

Criado 21 de junho de 2011
Ultima resposta 15 de jul. de 2015
Respostas 16
Participantes 4