JDBC - 异常处理

  • 简述

    异常处理允许您以受控方式处理异常情况,例如程序定义的错误。
    当异常条件发生时,会抛出异常。术语抛出意味着当前程序执行停止,并且控制被重定向到最近的适用 catch 子句。如果不存在适用的 catch 子句,则程序的执行结束。
    JDBC 异常处理与 Java 异常处理非常相似,但对于 JDBC,您将处理的最常见异常是 java.sql.SQLException.
  • SQLException 方法

    SQLException 可能发生在驱动程序和数据库中。发生此类异常时,将向 catch 子句传递 SQLException 类型的对象。
    传递的 SQLException 对象具有以下可用于检索有关异常的附加信息的方法 -
    方法 描述
    getErrorCode () 获取与异常关联的错误号。
    getMessage( ) 获取 JDBC 驱动程序的错误消息,由驱动程序处理或获取 Oracle 错误号和数据库错误消息。
    getSQLState() 获取 XOPEN SQLstate 字符串。对于 JDBC 驱动程序错误,此方法不会返回任何有用的信息。对于数据库错误,返回五位 XOPEN SQLstate 代码。此方法可以返回 null。
    getNextException( ) 获取异常链中的下一个异常对象。
    printStackTrace() 打印当前异常或可抛出的异常,它是标准错误流的回溯。
    printStackTrace(PrintStream s) 将此 throwable 及其回溯打印到您指定的打印流。
    printStackTrace(PrintWriter w) 打印这个 throwable 并且它是您指定的打印作者的回溯。
    通过利用 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 Alex
    
    C:\>
    
    
    通过传递错误的数据库名称或错误的用户名或密码来尝试上面的示例并检查结果。