区分JDBC驱动程序异常和数据库异常

时间:2014-10-31 23:30:06

标签: java jdbc sqlexception error-code

Jdbc tutorial声明如下:

  

SQLException可以在驱动程序和数据库中发生。什么时候   发生这样的异常时,SQLException类型的对象将是   传递给了catch子句。

同一教程还指出:

  

getSQLState():获取XOPEN SQLstate字符串。对于JDBC驱动程序   错误,此方法不返回任何有用的信息。为一个   数据库错误,返回五位XOPEN SQLstate代码。这个   方法可以返回null。

因此,似乎SQLException可能出现在驱动程序和数据库中。

我正在查看SQLExceptionoracle docsoracle jdbc tutorial 其中说明了以下关于 SQLState代码

的内容
  

SQLState代码:这些代码及其各自的含义   由ISO / ANSI和Open Group(X / Open)标准化,尽管有些代码   已被保留供数据库供应商自行定义。这个   String对象由五个字母数字字符组成。检索这个   代码通过调用方法SQLException.getSQLState。

以及错误代码

  

错误代码:这是一个标识错误的整数值   导致抛出SQLException实例。它的价值和意义   是特定于实现的,可能是实际的错误代码   由底层数据源返回。通过调用检索错误   方法SQLException.getErrorCode。

从两者看来,似乎SQLState代码可以更好地区分驱动程序和数据库异常。

要区分Diver异常和数据库异常,请执行以下工作中的catch子句:

   catch (SQLException se) 
   {   
       if(se.getSQLState() != null) 
       {
         System.out.println("Exception occured in the database");

         System.out.println("Database's native Error Code:"+se.getErrorCode());

         try
         {
            if(conn.getMetaData().getSQLStateType() == 1)
            {
                System.out.println("Open Group Error Code : "+ se.getSQLState());
            }
            else if(conn.getMetaData().getSQLStateType() == 2) 
            {
                System.out.println("SQL99 Error Code : "+ se.getSQLState());                    
            }
            else
            {
                System.out.println("Database vendor reserved Code : "+ se.getSQLState());                   
            }
         }  
         catch (SQLException e) 
         {
            e.printStackTrace();
         }
       }
       else 
       {
           System.out.println("Exception occured in the databse driver");

           System.out.println("Datasbe Driver Error Code:"+se.getErrorCode());
       }

       // ***  Code for cleaning up database resources would go here ***
   }

1 个答案:

答案 0 :(得分:3)

  

似乎SQLException可以在驱动程序和数据库中发生。

没有

只有驱动程序才能抛出SQLException。它是为了响应数据库生成的错误。驱动程序的部分功能是将它们映射到SQLExceptions。

您应该使用Oracle JDBC tutorial,而不是任意的互联网垃圾。 官方教程所说的是'当JDBC在与数据源交互时遇到错误时,会抛出SQLException'的实例。 [我的重点]。