看看牛人如何Handle Exception
2008-09-04 15:57
211 查看
以下为全文拷贝:来自http://trace.javaeye.com/blog
MyEclipse有一个Hibernate的插件,用它可以快速地生成与Hibernate操作有关的代码,十分方便。初学Hibernate时,调用着这些自动生成的代码,看着数据库中一行行操作成功的数据,喜悦之情溢于言表。
但是,今天,当我将hibernate用于项目,在Servlet环境下调用时,我需要的ServletExcpetion竟然无从产生。难道当数据库操作失败时,Servlet容器就放过这个错吗?显然不能。然而看看自己的代码,我找不到一处强制抛出错误的地方(Eclipse会在强制处理Exception的地方提示你)。再看看Hibernate自动生成的DAO类,果然没有一个方法抛出异常:
public void save(Employee transientInstance) {
log.debug("saving Employee instance");
try {
getSession().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
public void delete(Employee persistentInstance) {
log.debug("deleting Employee instance");
try {
getSession().delete(persistentInstance);
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
}
public Employee findById(java.lang.String id) {
log.debug("getting Employee instance with id: " + id);
try {
Employee instance = (Employee) getSession().get(
"apqp.hbm.admin.employee.Employee", id);
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}
这些方法在内部处理的是RuntimeException。可是save()等一些数据库操作方法应该是会抛出异常的啊,按照Hibernate API,这些方法都会抛出HibernateException。但是(看看,多曲折啊),当我在API中将HibernateException找到时,发现它竟然是RuntimeException的子类,难怪抓不住它的!
现在我搞清楚了,操作hibernate时,该抛出异常的地方你得自己抓异常,比如:
DepartmentDAO dao = new DepartmentDAO();
Transaction t = dao.getSession().beginTransaction();
dao.save(new Department("采购部"));
t.commit();
dao.getSession().close();
这里不写异常也能运行,但是不符合业务逻辑的需要。因此,在可能出现异常的地方,要catch HibernateExcpetion。可是,那些地方时可能出现异常的地方呢?参照了一些高手的代码,综合了一下他们的特点,我决定:
DepartmentDAO dao = new DepartmentDAO();
Transaction t = null;
try {
t = dao.getSession().beginTransaction();
dao.save(new Department("采供部"));
t.commit();
dao.getSession().close();
} catch (HibernateException e) {
// Do Some Exception Handler Operate
if (t!=null) {
t.rollback();
}
} finally {
dao.getSession().close();
}
这样,我就抓到HibernateExcpetion了。
补充:一直对如何Handle Exception有疑惑,除了使用System.err.println()和e.printStackTrace()将Exception报告出来、使用throw讲Exception继续抛出、使用try-catch实现类似if-else的转向功能、使用try-catch给同一变量赋不同的value值(eg: try{i=0}catch(){i=1}),还没遇到过其他Handle Exception的方法。上面载录过来的帖子开阔了我的视野,尤其是使用try-catch进行log处理和回滚。学习!!
MyEclipse有一个Hibernate的插件,用它可以快速地生成与Hibernate操作有关的代码,十分方便。初学Hibernate时,调用着这些自动生成的代码,看着数据库中一行行操作成功的数据,喜悦之情溢于言表。
但是,今天,当我将hibernate用于项目,在Servlet环境下调用时,我需要的ServletExcpetion竟然无从产生。难道当数据库操作失败时,Servlet容器就放过这个错吗?显然不能。然而看看自己的代码,我找不到一处强制抛出错误的地方(Eclipse会在强制处理Exception的地方提示你)。再看看Hibernate自动生成的DAO类,果然没有一个方法抛出异常:
public void save(Employee transientInstance) {
log.debug("saving Employee instance");
try {
getSession().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
public void delete(Employee persistentInstance) {
log.debug("deleting Employee instance");
try {
getSession().delete(persistentInstance);
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
}
public Employee findById(java.lang.String id) {
log.debug("getting Employee instance with id: " + id);
try {
Employee instance = (Employee) getSession().get(
"apqp.hbm.admin.employee.Employee", id);
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}
这些方法在内部处理的是RuntimeException。可是save()等一些数据库操作方法应该是会抛出异常的啊,按照Hibernate API,这些方法都会抛出HibernateException。但是(看看,多曲折啊),当我在API中将HibernateException找到时,发现它竟然是RuntimeException的子类,难怪抓不住它的!
现在我搞清楚了,操作hibernate时,该抛出异常的地方你得自己抓异常,比如:
DepartmentDAO dao = new DepartmentDAO();
Transaction t = dao.getSession().beginTransaction();
dao.save(new Department("采购部"));
t.commit();
dao.getSession().close();
这里不写异常也能运行,但是不符合业务逻辑的需要。因此,在可能出现异常的地方,要catch HibernateExcpetion。可是,那些地方时可能出现异常的地方呢?参照了一些高手的代码,综合了一下他们的特点,我决定:
DepartmentDAO dao = new DepartmentDAO();
Transaction t = null;
try {
t = dao.getSession().beginTransaction();
dao.save(new Department("采供部"));
t.commit();
dao.getSession().close();
} catch (HibernateException e) {
// Do Some Exception Handler Operate
if (t!=null) {
t.rollback();
}
} finally {
dao.getSession().close();
}
这样,我就抓到HibernateExcpetion了。
补充:一直对如何Handle Exception有疑惑,除了使用System.err.println()和e.printStackTrace()将Exception报告出来、使用throw讲Exception继续抛出、使用try-catch实现类似if-else的转向功能、使用try-catch给同一变量赋不同的value值(eg: try{i=0}catch(){i=1}),还没遇到过其他Handle Exception的方法。上面载录过来的帖子开阔了我的视野,尤其是使用try-catch进行log处理和回滚。学习!!
相关文章推荐
- 看看牛人是如何学习嵌入式的
- Engadget求知系列:看看硬盘是如何运作(牛人一片啊!)
- 看看又一牛人如何整估骗子的
- 看看国外是如何学习程序的
- 丢掉那些所谓的真理,来看看如何做好产品?
- 处理字符串时如何选择buffer的大小和分配方式 - 看看 redis 是怎么做的
- 如何一夜之间成为一个牛的软件开发者(转自一个国外的牛人)
- KMP, 看看双引号如何, "测测"
- mvc 设置起始页会报bug,看看如何消除起始页
- [轉]如何体现封装、继承、多态 编程人员看看!!!
- 不是技术牛人,如何拿到国内IT巨头的Offer
- JeeSite 默认MySql,让我们来看看如何更换为Oracle数据库
- 四大CTO坐谈技术牛人如何规划职业发展
- 发过200余篇SCI/EI论文的牛人教你如何写英语论文
- 程序员总结-如何干好一个技术牛人
- 不是牛人,如何拿OFFER(转)
- 看看百度地图如何获取坐标和缩放级别吧
- 不是技术牛人,如何拿到国内IT巨头的Offer