【问题标题】:What is the point of declaring an exception rather than handling it声明异常而不是处理异常有什么意义
【发布时间】:2012-04-08 19:27:39
【问题描述】:

据我了解,如果您只声明一个已检查异常,它将通过您的所有方法传播到 main 方法,并且仍然会中断您的正常程序流程,您的程序仍然会停止工作。那么,为什么不总是使用 try/catch 处理已检查的异常……这样您的程序就不会因异常而停止?为什么要在方法的签名中声明一个异常?对不起我的英语不好

【问题讨论】:

  • @dido:除了 Jon Skeet 回答的问题(您可以真正处理的例外情况相对较少)之外,您还必须问自己这个问题:“程序员如何能够用无数种甚至没有检查异常概念的语言工作?”。检查异常几乎是 Java 特有的,每天有 很多 程序员使用没有检查异常概念的语言编写。检查的异常也存在于您客户的问题域中。 300 KLOC 代码库在这里我们不会抛出一次检查异常。

标签: java exception try-catch throw try-catch-finally


【解决方案1】:

异常的要点是你可以选择在哪个级别来捕获它们;您不必立即执行此操作 - 有时这是正确的做法,但单个顶级 catch 子句可以通过记录它们然后跳到下一个任务/请求来处理所有其他异常(例如在 servlet 中)容器)。

Java 的检查异常试图通过强制您处理或声明异常来使这种机制更加明确。这可以防止您忘记要立即处理的异常。

但是,许多人认为这是语言设计中的一次失败实验(请注意,没有其他语言采用检查异常),因为它迫使您在所有级别都有一些与异常相关的代码——这正是设计要避免的异常。

【讨论】:

    【解决方案2】:

    适用于更复杂的系统。无论谁在链的上层使用你的代码,都可能想知道哪里出了问题,所以你让他们处理异常。它不一定会一直到 main (而且实际上不可能,除非堆栈中的每个方法都抛出该异常,这会破坏整个目的。

    【讨论】:

      【解决方案3】:

      例如,如果调用方法能够更好地处理异常。

      假设您有一些读取文件的方法。如果文件不存在,该方法如何知道需要发生什么?也许整个程序应该终止,也许我们应该通过弹出窗口通知用户,也许它应该记录异常并继续,也许它应该尝试从备份中恢复文件。只有调用方法知道,所以应该实现异常处理。

      【讨论】:

        【解决方案4】:

        据我了解,如果您只声明一个已检查异常,它将通过您的所有方法传播到 main 方法,并且仍然会中断您的正常程序流程,您的程序仍然会停止工作。

        当然。如果发生了您真的无法处理的事情,那是一件的事情。

        例如,假设您有一个程序要使用文件中的一些数据更新您的数据库 - 但您无法加载文件。

        可以捕获异常,忽略它并仍然覆盖数据库中的数据......但这不是是一件好事。一旦你处于你没有准备好的情况,或者你根本无法明智地继续,那么停止是负责任的事情

        当然,如果您能够真正处理异常并继续处理,那就太好了 - 但根据我的经验,相对很少出现这种情况。如果您正在编写服务器端应用程序,您通常希望中止请求(并给客户端一个错误)。如果您正在编写 UI,那么您可能只想放弃当前的操作,通知用户并让他们继续操作……这里的情况略有不同。

        但是无条件地捕捉所有异常并假装它们没有发生?

        【讨论】:

        • fyi,我认为他的意思是 unchecked (会向上传播)。不过你的回答很好:)
        • @Bohemian 实际上我认为他的意思是 checked 异常,因为他说的是必须在方法签名中声明它们。
        猜你喜欢
        • 2011-02-19
        • 2011-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-26
        相关资源
        最近更新 更多