java中处理异常的可管理方法

发布于 2024-09-15 12:21:18 字数 781 浏览 3 评论 0原文

我正在尝试想出一种可管理的方法来处理 DAO 中的异常。通常,我的 DAO 中的方法如下所示:

public ArrayList fetchColors (String id)
{
    //call iBatis SqlMapClient
    //put results in a list
    //return list
}

如果上述代码中发生错误,则所有内容都会写入 server.log ,并在首页上显示自定义错误屏幕。但是,我想避免将堆栈跟踪放入 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 中的所有方法?

I am trying to come up with a manageable way to handle exceptions in a DAO. Typically a method in my DAO looks like this:

public ArrayList fetchColors (String id)
{
    //call iBatis SqlMapClient
    //put results in a list
    //return list
}

If an error happens in the above code then everything is written to server.log and on the front page I show custom error screen. However, I want to avoid to put the stacktrace to server.log but instead write it to my_app.log (I'm using log4j).

So I'm planning to transform above method to following:

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
}

Questions:

  • Is this the best way to approach the problem?
  • I have lot of methods in the DAO and doing the above for each method will be a PITA..Is there an easier way to do this so same thing applies to all the methods in a DAO?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

深海蓝天 2024-09-22 12:21:18

我认为你可以在这里使用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);

I think you can use AOP here. For example:

<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>

Also as a side note you should always log like this so that you can see the stack trace in the log file.

logger.log (e,e);

云雾 2024-09-22 12:21:18

一种“回调”解决方案,用于处理异常并在一个地方登录:

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     
            }        
    });
}

A 'callback' solution in order to handle exception and log in one place:

interface CallBack{
    void invoke();
}

Define a skeleton method like:

//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;
    }
}

Call it like:

public ArrayList fetchColors (String id) throws SqlException{
    doBusiness(new CallBack(){

        public void invoke() {
               //call iBatis SqlMapClient
               //put results in a list     
            }        
    });
}
风铃鹿 2024-09-22 12:21:18

我建议您添加一些使用 Spring AOP 进行日志记录。正如 CoolBeans 所示,您可以简单地使用 @AfterThrowing 建议。

I recommend you add some method logging with Spring AOP. As CoolBeans showed, you can simply use an @AfterThrowing advice.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文