处理错误
使用 Microsoft JDBC Driver for SQL Server 时,所有数据库错误条件都作为异常通过 SQLServerException 类返回到 Java 应用程序。 SQLServerException 类的以下方法继承自 java.sql.SQLException 和 java.lang.Throwable;并且可用于返回有关出现的 SQL Server 错误的特定信息:
getSQLState()
返回异常的标准 X/Open 或 SQL99 状态代码。getErrorCode()
返回特定的数据库错误号。getMessage()
返回异常的完整文本。 错误消息文本对问题加以说明,并且经常包括可提供信息的占位符,如对象名称,在显示时,这些占位符会插入到错误消息中。getSQLServerError()
返回SQLServerError
对象,该对象包含有关从 SQL Server 接收的异常的详细信息。 如果未发生服务器错误,则此方法返回 null。
SQLServerError
类的以下方法可用于获取有关服务器生成的错误的更多详细信息。
SQLServerError.getErrorMessage()
返回从服务器接收的错误消息。SQLServerError.getErrorNumber()
返回一个标识错误类型的数字。SQLServerError.getErrorState()
从 SQL Server 返回表示错误、警告或“找不到数据”消息的数字错误代码。SQLServerError.getErrorSeverity()
返回收到的错误的严重性级别。SQLServerError.getServerName()
返回运行生成错误的 SQL Server 实例的计算机的名称。SQLServerError.getProcedureName()
返回生成错误的存储过程或远程过程调用 (RPC) 的名称。SQLServerError.getLineNumber()
从生成错误的 Transact-SQL 批命令或存储过程中返回行号。
在下一个示例中,将向函数中传递 SQL Server AdventureWorks2022 示例数据库的一个开放式连接,并构造一条没有 FROM 子句、格式错误的 SQL 语句。 然后,运行该语句并处理 SQL 异常。
public static void executeSQLException(Connection con) {
try (Statement stmt = con.createStatement();) {
String SQL = "SELECT TOP 10 * Person.Contact";
ResultSet rs = stmt.executeQuery(SQL);
while (rs.next()) {
System.out.println(rs.getString("FirstName") + " " + rs.getString("LastName"));
}
}
catch (SQLException se) {
do {
System.out.println("SQL STATE: " + se.getSQLState());
System.out.println("ERROR CODE: " + se.getErrorCode());
System.out.println("MESSAGE: " + se.getMessage());
System.out.println();
}
while (se != null);
}
}
使用 ServerMessageHandler
从版本 12.8.0 开始,驱动程序增加一个 ServerMessageHandler
,从而可以更好地控制错误反馈和日志记录。 要使用 ServerMessageHandler
,需要实现 ISQLServerMessageHandler
接口。 ServerMessageHandler
的功能包括:
消息反馈
允许接收长时间运行的查询的反馈(如进度消息)。 例如,RAISERROR ('Progress message...', 0, 1) WITH NOWAIT
。
通用错误日志记录
允许消息处理程序处理所有错误的日志记录。
通用错误处理
允许错误处理逻辑的范围仅限于 ServerMessageHandler
,而不是在整个应用程序中重复相同的错误处理。
重映射错误消息严重性
允许识别和更改特定错误消息的严重性:
SQLServerError.toSQLServerInfoMessage()
会返回通过将错误消息降级为信息消息创建的ISQLServerMessage
。SQLServerError.toSQLServerInfoMessage(int newErrorSeverity)
会返回通过将错误消息降级为信息消息创建的ISQLServerMessage
,并赋予一个新的错误严重性。SQLServerError.toSQLServerInfoMessage(int newErrorSeverity, int newErrorNumber)
会返回通过将错误消息降级为信息消息创建的ISQLServerMessage
,并赋予一个新的错误严重性和错误号。SQLServerInfoMessage.toSQLServerError()
会返回通过将信息消息升级为错误消息创建的ISQLServerMessage
。SQLServerInfoMessage.toSQLServerError(int newErrorSeverity)
会返回通过将信息消息升级为错误消息创建的ISQLServerMessage
,并赋予一个新的错误严重性。SQLServerInfoMessage.toSQLServerError(int newErrorSeverity, int newErrorNumber)
会返回通过将信息消息升级为错误消息创建的ISQLServerMessage
,并赋予一个新的错误严重性和错误号。
SQLExceptionChaining
此外,在版本 12.8.0 中,SQLExceptions 也可以链接在一起,因此最终异常消息会自动包含可能已丢失的所有异常。 此功能默认启用。