我在 Java 方面的经验不多,如果您对这个问题有所了解,我将不胜感激。
我有以下一段代码(方法)来建立与 PostgreSQL 数据库的 JDBC 连接:
public void establishDBConnection() throws SQLException {
try (Connection connection = DriverManager.getConnection(
"jdbc:postgresql://" + dbServer + ":" + dbPort + "/" +
dbDatabase, dbUser, dbPassword))
catch (SQLException e) {
logger.error("Connection to Postgres Database Failed: " +
e.printStackTrace();
}
}
我希望一旦该方法无法与数据库建立连接(服务器已关闭),SQLException 就会被 catch block 捕获。 catch block 将异常放在控制台上,但我看到在执行 getConnection 方法后不久就显示了相同的异常。因此,我在控制台上有 2 个完全相同的异常。见下文。
问题是这是什么原因以及如何强制应用程序只显示 catch block 生成的异常。
日志:
Jul 07, 2017 9:11:53 PM org.postgresql.Driver connect
SEVERE: Connection error:
**org.postgresql.util.PSQLException: Connection to localhost:5433 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.**
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:265)
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:431)
at org.postgresql.Driver.connect(Driver.java:247)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at excel2db.service.impl.DBConnectionPostgresImpl.establishDBConnection(DBConnectionPostgresImpl.java:38)
at excel2db.excel2db.main(excel2db.java:86)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.postgresql.core.PGStream.<init>(PGStream.java:62)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:144)
... 13 more
21:11:53.465 [main] ERROR e.s.impl.DBConnectionPostgresImpl - **Connection to Postgres Database Failed: Connection to localhost:5433 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.**
最佳答案
您的示例中只打印了一个异常:SQLException 被捕获。您认为第二个异常只是(如文本所示)SQLException 的原因:Postgres 抛出 SQLException,它本身被抛出是因为当 Portgres 尝试连接时存在网络 ConnectException。
当您需要诊断故障时,这个异常链非常方便。它允许回到问题的原始、低级来源。就像,例如,知道您没有收到邮件(NoMailException)是因为邮局罢工(OnStrikeException),因为政府决定降低工资(WagesTooLowException)可能很有用。如果您只有原始的 NoMailException,您将无法知道您没有收到邮件的原因,知道这可能是暂时的,等等。
在这种特殊情况下,您可以推断无法连接到服务器,而不是例如密码不正确。
通过调用一个将另一个异常作为参数的异常构造函数来简单地实现链接异常(大多数异常都是如此)。参见 https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html#Exception-java.lang.String-java.lang.Throwable- .
关于java - 捕获 Java SQLException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44977303/