我正在努力想出一种可管理的方法来处理DAO中的异常。通常,我的DAO中的方法如下所示:
public ArrayList fetchColors (String id)
{
//call iBatis SqlMapClient
//put results in a list
//return list
}
如果上述代码中发生错误,则所有内容都写入server.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
}
问题:
答案 0 :(得分:4)
我认为你可以在这里使用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);
答案 1 :(得分:2)
'回调'解决方案,以便处理异常并在一个地方登录:
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
}
});
}
答案 2 :(得分:2)
我建议您添加一些method logging with Spring AOP。正如CoolBeans所示,您可以简单地使用@AfterThrowing建议。