【问题标题】:how and where to catch exceptions in a j2ee application在 j2ee 应用程序中如何以及在何处捕获异常
【发布时间】:2009-06-06 01:23:05
【问题描述】:

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

我正在编码,然后 netbeans 问我“必须发现或声明要抛出未报告的异常等等”,然后让我选择只处理每个异常,或者只是抛出它希望其他人捕获。

我正在使用的类是这些:

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

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

DataObject 只是 CRUD,DBMS 和 java 之间的类型转换,以及一些反射的东西,为了通用,它使用 Database 作为成员变量

PersonDB 是一个名为 person 的表中字段到 java 类型的映射,这个类扩展了 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

我为我的英语道歉

【问题讨论】:

    标签: java exception jakarta-ee struts


    【解决方案1】:

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

    其次,如果您确实需要打点他,那么问问自己:这个异常发生的结果是什么?是否可恢复?还是故障如此严重,您的应用程序无法运行?

    如果灾难如此严重,您的应用程序无法运行,请执行以下操作:

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

    用“throws ...”子句污染你的界面是没有意义的。

    或者,如果它是可恢复的或潜在可恢复的,那么您确实需要更好地处理它。但是很难给出答案。真的要视情况而定。

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

    【讨论】:

      【解决方案2】:

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

      有时值得捕获只是为了抛出另一个抽象级别的异常(“我可以为调用者产生更清晰的错误吗?”)。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-12
        • 2022-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多