В этом руководстве по Jdbc говорится следующее:
SQLException может возникнуть как в драйвере, так и в базе данных. При возникновении такого исключения в предложение catch будет передан объект типа SQLException.
В том же учебнике также говорится:
getSQLState(): получает строку XOPEN SQLstate. В случае ошибки драйвера JDBC этот метод не возвращает никакой полезной информации. Для ошибки базы данных возвращается пятизначный код XOPEN SQLstate. Этот метод может возвращать значение null.
Таким образом, кажется, что SQLException может возникнуть в драйвере и в базе данных.
Я просматривал документы Oracle для SQLException
class и учебник по jdbc oracle, в котором говорится следующее о Код 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 ***
}