JDBC - 异常处理


异常处理允许您以受控方式处理异常情况,例如程序定义的错误。

当异常情况发生时,会抛出异常。术语“抛出”意味着当前程序执行停止,并且控制被重定向到最近的适用的 catch 子句。如果不存在适用的 catch 子句,则程序的执行结束。

JDBC 异常处理与 Java 异常处理非常相似,但对于 JDBC,您要处理的最常见异常是java.sql.SQLException。

SQLException 方法

SQLException 可能发生在驱动程序和数据库中。当发生此类异常时,SQLException 类型的对象将被传递给 catch 子句。

传递的 SQLException 对象具有以下可用于检索有关异常的附加信息的方法 -

方法 描述
获取错误代码() 获取与异常关联的错误号。
获取消息() 获取由驱动程序处理的 JDBC 驱动程序的错误消息,或者获取数据库错误的 Oracle 错误号和消息。
获取SQLState() 获取 XOPEN SQLstate 字符串。对于 JDBC 驱动程序错误,此方法不会返回任何有用的信息。对于数据库错误,将返回五位 XOPEN SQLstate 代码。该方法可以返回 null。
获取下一个异常() 获取异常链中的下一个 Exception 对象。
打印堆栈跟踪() 打印当前异常或可抛出异常,并且回溯到标准错误流。
printStackTrace(PrintStream s) 将此 throwable 及其回溯打印到您指定的打印流。
printStackTrace(PrintWriter w) 打印此可抛出对象,并将其回溯到您指定的打印编写器。

通过利用 Exception 对象中的可用信息,您可以捕获异常并适当地继续您的程序。这是 try 块的一般形式 -

try {
   // Your risky code goes between these curly braces!!!
}
catch(Exception ex) {
   // Your exception handling code goes between these 
   // curly braces, similar to the exception clause 
   // in a PL/SQL block.
}
finally {
   // Your must-always-be-executed code goes between these 
   // curly braces. Like closing database connection.
}

例子

研究以下示例代码以了解try...catch...finally块的用法。

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCExample {
   static final String DB_URL = "jdbc:mysql://localhost/TUTORIALSPOINT";
   static final String USER = "guest";
   static final String PASS = "guest123";
   static final String QUERY = "{call getEmpName (?, ?)}";

   public static void main(String[] args) {
      // Open a connection
      try(Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
         CallableStatement stmt = conn.prepareCall(QUERY);
      ) {		      
         // Bind values into the parameters.
         stmt.setInt(1, 1);  // This would set ID
         // Because second parameter is OUT so register it
         stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
         //Use execute method to run stored procedure.
         System.out.println("Executing stored procedure..." );
         stmt.execute();
         //Retrieve employee name with getXXX method
         String empName = stmt.getString(2);
         System.out.println("Emp Name with ID: 1 is " + empName);
      } catch (SQLException e) {
         e.printStackTrace();
      } 
   }
}

现在,让我们按如下方式编译上面的示例 -

C:\>javac JDBCExample.java
C:\>

当您运行JDBCExample时,如果没有问题,它会产生以下结果,否则会捕获相应的错误并显示错误消息 -

C:\>java JDBCExample
Executing stored procedure...
Emp Name with ID: 1 is Zara
C:\>

通过传递错误的数据库名称或错误的用户名或密码来尝试上面的示例,并检查结果。