gpt4 book ai didi

java - 在 JDBC 类中捕获 UnknownHostException

转载 作者:行者123 更新时间:2023-12-02 12:21:36 24 4
gpt4 key购买 nike

我使用 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,这样它们就不会扰乱应用程序的可用性。

我应该在哪里以及如何捕获这些 UnknownHostException?我已经尝试了一切,但没有任何效果。

这是我的 BDConnection 类:

public class BDConnection {
private String m_cc;
private String m_Driver;
public Statement statement;
public Connection conn;
ComboPooledDataSource m_Conexion;

public BDConnection() throws SQLException, ClassNotFoundException {
m_Driver = "org.postgresql.Driver";
m_cc = "jdbc:postgresql://myserver.com/mydb";
open();
}

public ComboPooledDataSource GetConexion() {
return m_Conexion;
}

public void open() throws ClassNotFoundException, SQLException {
try {
if (m_Conexion == null) {
m_Conexion = new ComboPooledDataSource();
m_Conexion.setDriverClass( m_Driver );
m_Conexion.setJdbcUrl( m_cc );
m_Conexion.setUser("user");
m_Conexion.setPassword("password");
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}

public boolean isOpen() throws SQLException {
return (m_Conexion != null);
}

public void close() throws SQLException {
if (isOpen()) {
conn.close();
}
}

public ResultSet RS_Query(String SQL){
try {
conn = m_Conexion.getConnection();
conn.setAutoCommit(false);
statement = conn.createStatement();
ResultSet result = statement.executeQuery(SQL);
conn.commit();
return result;
} catch (final SQLException e) {
e.printStackTrace();
} finally {
m_Conexion.close();
}
return null;
}

public void RS_Update(String SQL){
try {
conn = m_Conexion.getConnection();
conn.setAutoCommit(false);
statement = conn.createStatement();
statement.executeUpdate(SQL);
conn.commit();
} catch (final SQLException e) {
e.printStackTrace();
} finally {
m_Conexion.close();
}
}
}

最佳答案

立即澄清:UnknownHostException 不是直接抛出的,而是被包装(可能是间接)在某些 SQLException 中。

我想你得到了捕获的包装异常

} catch (final SQLException e) {
e.printStackTrace();
} finally {

在您的 RS_Query() 方法中。

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

} catch (final SQLException e) {
if (causedByUnknownHostException(e)) {
throw new RuntimeUnknownHostException(e);
} else {
// processing somehow an exception which is not caused by UnknownHostException
e.printStackTrace();
}
} finally {

其中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 异常处理程序。

关于java - 在 JDBC 类中捕获 UnknownHostException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45742237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com