我正在使用hibernate在spring中执行sql语句但是为了处理异常我使用了hibernate异常和sql异常但是我无法处理异常
如果我的sql服务器没有打开或无法访问我无法捕获异常我收到错误
org.hibernate.exception.JDBCConnectionException
此处name.save(user);
是执行sql命令的hibernate命令
如何捕捉此类异常
我收到错误
JDBCConnectionException的无法访问的catch块。从不会从try语句主体抛出此异常
SQLException的无法访问的catch块。永远不会从try语句主体
抛出此异常mycode的:
try
{
ApplicationContext appContext =
new ClassPathXmlApplicationContext("/config/BeansInfo.xml");
TokenBo tokenBo = (TokenBo)appContext.getBean("TokenBo");
TokenModel token = new TokenModel();
token.setNumber(Number);
token.setID(ID);
}
catch(JDBCConnectionException ex )
{
System.out.println(ex);
}
catch(SQLException e){}
答案 0 :(得分:2)
对于连接相关的异常使用 JDBCConnectionException ,对于约束违规使用 ConstraintViolationException 。您应该根据您的要求使用其他例外。见enter link description here
答案 1 :(得分:1)
除了@Tanjim Rahman,
代码段
在UserDAOImpl.java
中使用ConstraintViolationException捕获重复的条目
@Override
public String addUser(User user)
{
Session openSession = sessionFactory.openSession();
String retStr = null;
try
{
openSession.getTransaction().begin();
openSession.persist(user);
openSession.getTransaction().commit();
retStr = "success";
}
catch (ConstraintViolationException e)
{
openSession.getTransaction().rollback();
String[] tmpArr = e.getSQLException().toString().split(":");
String[] anotherTmpArr = null;
if( tmpArr.length > 1)
{
anotherTmpArr = tmpArr[1].split("for key");
}
retStr = anotherTmpArr[0];
}
catch (HibernateException e)
{
retStr = e.getLocalizedMessage();
}
finally
{
openSession.close();
}
return retStr;
}
答案 2 :(得分:0)
您可能只会捕获直接抛出的异常(至少对于已检查的异常......)。如果你真的想以任何合理的方式处理这个特定的错误情况,那么就有可能捕获到你的内容并检查提供的异常原因
try {
// some hibernate calls
} catch (GenericJdbcException ge) {
if(ge.getCause() != null && ge.getCause() instanceof SQLException) {
SQLException se = (SQLException)ge.getCause();
if(se.getErrorCode() == -911) {
// your error handling for this case
}else{
throw ge; // do not swallow unhandled exceptions
}
}else{
throw ge // do not swallow unhandled exceptions
}
}