java中处理异常的可管理方法
我试图找到一种可管理的方法来处理DAO中的异常。我的DAO中的方法通常如下所示:java中处理异常的可管理方法,java,spring,exception,ibatis,dao,Java,Spring,Exception,Ibatis,Dao,我试图找到一种可管理的方法来处理DAO中的异常。我的DAO中的方法通常如下所示: public ArrayList fetchColors (String id) { //call iBatis SqlMapClient //put results in a list //return list } 如果上述代码中发生错误,则所有内容都将写入服务器.log,并在首页显示自定义错误屏幕。但是,我希望避免将stacktrace放在server.log中,而是将其写入my_a
public ArrayList fetchColors (String id)
{
//call iBatis SqlMapClient
//put results in a list
//return list
}
如果上述代码中发生错误,则所有内容都将写入服务器.log,并在首页显示自定义错误屏幕。但是,我希望避免将stacktrace放在server.log中,而是将其写入my_app.log
(我使用的是log4j)
因此,我计划将上述方法转换为以下方法:
public ArrayList fetchColors (String id) throws SqlException
{
try {
//call iBatis SqlMapClient
//put results in a list
}
catch (SqlException e)
{
logger.log (e);
throws e;
}
//return list
}
问题:
- 这是解决问题的最佳方法吗
- 我在DAO中有很多方法,对每个方法执行上述操作将是一个PITA。有没有更简单的方法来执行此操作,以便相同的事情适用于DAO中的所有方法李>
interface CallBack{
void invoke();
}
定义一个骨架方法,如:
//Skeleton to handle exception and log in one place
public void doBusiness(CallBack callBack) throws SqlException{
try{
callBack.invoke();
}catch(SqlExceptione){
logger.log (e);
throws e;
}
}
可以这样说:
public ArrayList fetchColors (String id) throws SqlException{
doBusiness(new CallBack(){
public void invoke() {
//call iBatis SqlMapClient
//put results in a list
}
});
}
我想你可以在这里使用AOP。例如:
<bean id="exceptionLogger" class="my.good.ExceptionLogger" />
<aop:config>
<aop:pointcut id="allDaoMethods" expression="execution(* my.dao.*(..))" />
<aop:aspect id="daoLogger" ref="exceptionLogger">
<aop:after-throwing pointcut-ref="allDaoMethods"
method="logIt"
throwing="e"/>
</aop:aspect>
</aop:config>
另外,作为旁注,您应该始终这样记录,以便可以在日志文件中看到堆栈跟踪
logger.log(e,e)
我建议你加一些。正如CoolBeans所展示的,您可以简单地使用@afterhrowing建议。在我看来,这是最好的方法。Java只是一种非常冗长的语言。