在DAO中捕获错误是否很好?

时间:2009-11-25 20:33:57

标签: exception-handling glassfish log4j

public boolean checkInd() {
    int dis_ind = 2;
    HashMap parmMap = new HashMap();
    //line below can generate errors
    getSqlMapClientTemplate().queryForList("authentication.checkInd", parmMap);
    List results = (List) parmMap.get("Result0");
    HashMap resultMap;
    if (result.size()>0)
        resultMap = (HashMap)resultMap.get(0); 
    dis_ind = (Integer)resultMap.get("PK_VALUE");
    if (dis_ind == 1)
        return true;
    else
        return false;
}

代码的第5行可能会产生错误。仅举几例,错误可能是......映射中提到的存储过程不存在,映射中提到的列名不存在..等等..

如果我没有发现错误并且出现问题,那么日志跟踪会写在server.log上,并且web应用程序会停在我web.xml

中提到的错误页面上

如果我发现错误,那么网络应用程序不会停在错误页面并继续其快乐的方式(谁知道它现在将停止在哪里)。

所以到现在为止我不想在这里发现错误。

问题是我不想在server.log中编写堆栈跟踪(现在默认情况下会发生这种情况,如上所述)。相反,我想将堆栈跟踪写入名为myapp.log的文件(我们使用的是log4j)。但是,我不知道如何在不实际捕获错误的情况下将堆栈跟踪显式写入myapp.log。下面是我要编写的代码(但是应用程序将不会停止,因为我正在捕获错误并将继续运行,这不是很好)。

OurLogger log = OurLogger.getLogger("myapp", MyClassName.class);
public boolean checkInd() {
    int dis_ind = 2;
    try {
    HashMap parmMap = new HashMap();
    //line below can generate errors
    getSqlMapClientTemplate().queryForList("authentication.checkInd", parmMap);
    List results = (List) parmMap.get("Result0");
    HashMap resultMap;
    if (result.size()>0)
        resultMap = (HashMap)resultMap.get(0); 
        dis_ind = (Integer)resultMap.get("PK_VALUE");
    }
    catch (BadSqlGrammarException e) {log.error(e, e.getMessage());}
        if (dis_ind == 1)
            return true;
        else
            return false;
}

在这种情况下我有哪些选择以及最佳做法是什么?

PS:这个问题与我的其他question有关,但我试图在这个问题中添加例子并寻求最佳实践建议。

1 个答案:

答案 0 :(得分:0)

捕捉不需要是“永久性的”。只需捕获它,记录它,然后重新抛出错误。像这样:

catch (BadSqlGrammarException e) {
  log.error(e, e.getMessage());
  throw e;
}