如何以及在何处捕获j2ee应用程序中的异常

时间:2009-06-06 01:23:05

标签: java exception java-ee struts

好吧,我正在一个j2ee项目中工作,该项目在repo中有2个分支,我被命令混合它们。

我正在编码然后netbeans问我“未报告的异常blah bla bla必须是caugth或声明被抛出”并且让我选择只处理每个异常或只是抛出它希望别人抓住。

我正在使用的课程是:

DataBase - DataObject - PersonDB(我在这里工作)

DataBase是DBMS的抽象(支持其中几个)

DataObject只是CRUD,DBMS和java之间的类型转换,以及一些反映事项的一般性,它使用Database作为成员变量

PersonDB是表中字段的映射,称为person to java types,此类扩展DataObject

现在在版本1 (只是实际并行工作的名称)中捕获例如在类DataBase中生成它们的所有异常:

try {
        Class.forName(this.driver);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(BD.class.getName()).log(Level.SEVERE, null, ex);
    }

或在DataObject类中捕获: SQLException,NoSuchFieldException,IllegalArgumentException

现在第2版所有留给上线用户的内容如下:

public BD (String Adriver, String Ahost, String Abase, String Alogin, String Apassword) 
throws java.lang.ClassNotFoundException { ... }

这是你在这类问题中提出意见的最佳方式,特别是如果我使用struts

我为我的英语道歉

2 个答案:

答案 0 :(得分:2)

我要问的第一个问题是:如果这是一个J2EE应用程序,你在做什么手动加载JDBC驱动程序?这是data sources的用途。

其次,如果你确实需要点他的话,那就问问自己:这个例外的结果是什么?它是可恢复吗?或者失败是如此灾难性的应用程序无法运行?

如果它是如此灾难性的应用程序无法运行这样做:

try {
  ...
} catch (SomeCheckedException e) {
  throw new RuntimeException(e);
}

使用“throws ...”条款污染您的界面毫无意义。

或者,如果它是可恢复的或可能可恢复的,那么你需要更好地处理它。尽管如此,很难给出答案。真的,这取决于具体情况。

例如,如果您以这种方式加载模块/插件,则只需记录该插件XYZ无法加载(记录异常)并继续。如果这是用户操作的直接结果,您需要以某种方式向用户报告操作失败(并记录错误)等。

答案 1 :(得分:1)

异常处理始终是“我能处理吗?”的问题。 - 句柄不仅仅是记录和重新抛出。

有时值得抓住其他抽象级别的异常(“我可以为调用者产生更明确的错误吗?”)。

在这两种情况下你都要考虑是否传递原因(“它对调用者有用吗?”) - 不只是随时做,你会得到大量无用的日志文件。捕获异常时,通常会记录捕获的异常,可能只有调试级别,但是在调试客户系统的情况下,良好的日志信息通常是“调试”系统的唯一机会。

异常处理和日志记录通常做得不好。但对于产品或长期项目来说,这将是一项很好的投资。