Java 捕获JDBC类中的未知hostException

Java 捕获JDBC类中的未知hostException,java,postgresql,jdbc,exception-handling,c3p0,Java,Postgresql,Jdbc,Exception Handling,C3p0,我使用JDBC和c3p0将Swing应用程序连接到PostgreSQL数据库。当连接断开时,它会不可控地引发几个PSQLException和UnknownHostException,这是预期的 ago 17, 2017 5:39:25 PM org.postgresql.Driver connect GRAVE: Connection error: org.postgresql.util.PSQLException: El intento de conexión falló. at o

我使用JDBC和c3p0将Swing应用程序连接到PostgreSQL数据库。当连接断开时,它会不可控地引发几个PSQLException和UnknownHostException,这是预期的

ago 17, 2017 5:39:25 PM org.postgresql.Driver connect
GRAVE: Connection error: 
org.postgresql.util.PSQLException: El intento de conexión falló.
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:275)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:194)
    at org.postgresql.Driver.makeConnection(Driver.java:450)
    at org.postgresql.Driver.connect(Driver.java:252)
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220)
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138)
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44)
    at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
Caused by: java.net.UnknownHostException: academico.ulasalle.edu.pe
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at org.postgresql.core.PGStream.<init>(PGStream.java:68)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:144)
    ... 13 more

马上澄清一下:
UnknownHostException
不是直接抛出的,而是(可能间接地)封装在一些
SQLException

我想你会发现包装异常

} catch (final SQLException e) {
    e.printStackTrace();
} finally {
RS\u Query()
方法中

一种策略是捕获异常包装
UnknownHostException
,将其包装在自定义运行时异常中,并允许它飞到UI,在那里您可以捕获它并显示错误窗口(或非阻塞弹出窗口)

其中
RuntimeUnknownHostException
扩展
RuntimeException

然后在全局UI异常处理程序中处理它:

try {
    // some code calling conn.RS_Query(...);
} catch (RuntimeUnknownHostException e) {
    ... display the error message
}
检测代码:

private boolean causedByUnknownHostException(Throwable t) {
    if (t == null) {
        return false;
    }
    if (t instanceof UnknownHostException) {
        return true;
    }
    return causedByUnknownHostException(t.getCause());
}

为什么要取消选中异常(扩展
RuntimeException
)?这将避免在所有中间方法中声明它的负担,因此它可以到达您的集中化UI异常处理程序。

您好,在查看具体问题之前,这个类有很多问题。每次查询后,您都会关闭()连接池,这不是很好。连接池应该是长寿命的;在查询结束时,只应关闭连接。应该在finally块中关闭的是连接,而不是连接池(或者更好的方法是,将连接用作资源。非常感谢,我正在更改它。我尝试了它,但没有在那里捕获异常。此外,当我尝试在那里捕获UnknownHostException时,该块被指示为无法访问,因为该异常从未从“try”块中抛出。很抱歉,我错了,当然是
UnknownHostEx异常
不扩展
SQLException
,但在您的情况下,它由
SQLException
的子类包装。根据此更新了答案。
try {
    // some code calling conn.RS_Query(...);
} catch (RuntimeUnknownHostException e) {
    ... display the error message
}
private boolean causedByUnknownHostException(Throwable t) {
    if (t == null) {
        return false;
    }
    if (t instanceof UnknownHostException) {
        return true;
    }
    return causedByUnknownHostException(t.getCause());
}