【问题标题】:use of rethrowing checked/unchecked exceptions?使用重新抛出检查/未经检查的异常?
【发布时间】:2010-07-12 14:06:40
【问题描述】:

重新抛出已检查和未检查的异常有什么用?

【问题讨论】:

    标签: java exception exception-handling


    【解决方案1】:

    如果你想在问题发生时执行一些代码而不隐藏问题。

    例如,假设您想在写入数据库时​​发生异常时回滚更改:

    try {
        writeToDatabase();
    } catch(Exception ex) {
        rollbackChanges();
    }
    

    如果您使用此代码,调用函数将永远不会发现发生了异常。

    相反,你应该写

    try {
        writeToDatabase();
    } catch(Exception ex) {
        rollbackChanges();
        throw ex;
    }
    

    【讨论】:

    • 为什么要调用fillInStackTrace?它的文档没有说明它在多次调用时做了什么,但要么它会覆盖原始堆栈跟踪,在这种情况下,上面的代码隐藏了原来的原因,要么它什么也不做,在这种情况下,上面的代码具有不必要的复杂性.
    • 您通常不想回滚任何异常吗?
    • @Tom:是的,你可能会。
    【解决方案2】:

    说白了:使用异常处理。

    考虑到这一点,在出现异常之前(或者,在开发人员了解如何正确使用异常处理之前),如果出现“错误”,程序员会返回类似 -1 或 null 的错误代码。考虑到这一点,您将如何告诉某些方法失败了(例如:大型 API 中的某些低级 IO 方法失败)?您可以将大量返回 nulls/ 或 -1 串在一起,或者只是抛出一个异常,以便它迁移回它应该被捕获的地方,如果需要,甚至是 JVM 本身因为这个例外可能是你无法恢复的。

    所以基本上,如果您无法编写可以真正从抛出的异常中恢复的捕获逻辑,您将重新抛出异常。这在 Java 中经常是这种情况,因为 Java 会强制您捕获几乎所有的异常,因为大多数情况都是经过检查的异常。

    至于重新抛出已检查与未检查...在执行 J2EE 应用程序时,我经常会从已检查异常内部将新的未检查异常 (RuntimeExpcetion) 抛出回容器。容器具有处理异常并向用户显示默认错误页面的默认方式。这来自Aspect Oriented 范式。我也wrote about how to do this here

    【讨论】:

    • 我真的希望 Java 能够促进捕获已检查异常并重新抛出未检查异常的模式。我会假设,在语义上正确的操作过程的情况可能超过检查异常应该简单地通过方法冒泡的情况。
    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多