Try/catch não pegando a Exception

8 respostas
B

Eu estava usando JPA, e queria começar a fazer uns tratamento de exceções, porém, quando é lançado uma Exception, não está entrando no catch.

public static boolean openConnection() {
        try {
            if (emf == null) {
                emf = Persistence.createEntityManagerFactory("sysbex");
                em = emf.createEntityManager();
                transaction = em.getTransaction();
            }
            
        } catch (Throwable e) {
            System.out.println(e.getLocalizedMessage());
            Notify.error(e);
            return false;
        }

        return true;
    }

Alguém sabe o porque?

8 Respostas

ViniGodoy

Não faz sentido. O try catch sempre funciona. Seu erro está em outro lugar.

B

statckTrace lançada:

org.postgresql.util.PSQLException: FATAL: database "sysbex" does not exist
	at org.postgresql.core.v3.ConnectionFactoryImpl.readStartupMessages(ConnectionFactoryImpl.java:582)
	at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:185)
	at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:64)
	at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:144)
	at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:29)
	at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:21)
	at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:31)
	at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
	at org.postgresql.Driver.makeConnection(Driver.java:410)
	at org.postgresql.Driver.connect(Driver.java:280)
	at java.sql.DriverManager.getConnection(DriverManager.java:664)
	at java.sql.DriverManager.getConnection(DriverManager.java:208)
	at org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.getConnection(DriverManagerConnectionProviderImpl.java:173)
	at org.hibernate.tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.prepare(SuppliedConnectionProviderConnectionHelper.java:51)
	at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:194)
	at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:178)
	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:495)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1740)
	at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:889)
	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
	at br.com.sysbex.utils.ConnectionHibernate.openConnection(ConnectionHibernate.java:54)
	at br.com.sysbex.init.Main.main(Main.java:10)

Se eu colocar um System.out.println dentro do catch, ele não é executado.
E sim, eu sei que nção tem database com aquele nome, mas como falei, quero tratar algumas exceções e essa é uma dela.
Ali aparece que está ocorrendo erro na DriverManager, porém o driver está correto no classpath e se eu criar a base dados com esse nome, ele executa corretamente.
A linha do erro é na hora de criar a EntityManagerFactory.

ViniGodoy

Qual é a linha 54 do método no seu código?

E você tem certeza que o Throwable ali se refere ao java.lang.Throwable, e não a uma outra classe de mesmo nome definida em outro pacote?

B

Linha 54:

emf = Persistence.createEntityManagerFactory("sysbex");

E sim, é do pacote java.lang.

A

Verifica se a exception está sendo consumida, sem relançar.

B

Não entendi muito bem esse “consumida”.
Mas é a unica stack que aparece no console. Ela aparece 2x a mesma coisa.
Nunca vi disso :(((

A

Consumida = capturada, um try/catch anterior que capturou a exception e tratou-a (ou não, o que seria um erro grave).

B

Bom, “consegui fazer cair no catch”.

Onde eu estava chamando o método “openConnection” não estava com try/cacth pois eu estava tratando diretamente dentro do método.
Ai eu fiz o seguinte, tirei o try/catch de dentro do método e coloquei onde eu chamo ele, ai deu certo, entrou dentro do catch.

Mas se eu estou tratando dentro do método, ele deveria cair ali, não é? Fiquei um pouco confuso agora.

Criado 3 de agosto de 2014
Ultima resposta 4 de ago. de 2014
Respostas 8
Participantes 3