如何处理未经检查的异常?

use*_*234 4 java exception

我很难理解如何处理未经检查的异常.

如果方法没有声明异常并且我没有被强制处理它,我怎么知道该方法抛出异常?

未经检查的异常是针对编程错误的,正如我已经阅读过的,所以为了避免a NullPointerException,我会引入一个空检查.或者ArrayIndexOutOfBoundsException我会检查我如何访问数组.

但是当我不知道一个方法抛出一个自定义的未经检查的异常时,我该如何处理呢?

那么如何将异常从数据层传播到用户界面?那些必须检查例外,对吗?

我会让数据层抛出检查DataLayerExceptions然后在presenter类中有一个try-catch-block(假设我正在使用MVP)然后在catch-block中设置视图上的错误消息...

或者可以使用未经检查的例外来完成吗?

编辑

感谢到目前为止的回复.

这是我面临的一个具体例子.

我开始使用Spring,在一本书中我看到了一个UserRepository使用a JDBCTemplate从数据库中检索数据的类.在UserRepositoty一定程度上包含了这样的方法:

@Override
public List<User> findAll() {
    String sql = "select id, username, email, password from p_user";
    return new ArrayList<>(jdbcTemplate.query(sql, rowMapper));
}
Run Code Online (Sandbox Code Playgroud)

现在,jdbcTemplate的查询方法抛出a DataAccessException,这是一个运行时异常.

我知道这个,因为我查看了方法签名.

现在,我将如何处理此异常?当然,用户需要某种类型的反馈,以防出现问题.当然,我会记录异常.

但是我会在哪里捕获这个例外?

我应该在那里抓住它,然后重新抛出我自己的未经检查的异常吗?或者我应该DataAccessExceptionfindAll方法上声明一个抛出然后处理调用类中的异常(可能是某种服务或演示者)?

或者我应该确保抛出异常的条件永远不会发生(如果那些甚至可以被我控制)?

Ste*_*n C 7

我很难理解如何处理未经检查的异常.

怎么这么容易.您处理它们就像检查异常一样.你使用try/catch.(如果你想要检查异常RuntimeException,要抓住它们,捕获或捕获Exception.但要注意捕获ErrorThrowable捕获比预期更多的异常,否则你可以实际处理..)

你真正要问的是如何知道什么时候会抛出它们.这更难.

  • 正如您所观察到的,语言本身会抛出一些未经检查的异常.从理论上讲,编写代码是可能的,这样就不会发生.在实践中:1)人们犯错误; 2)过多的防守检查是繁重的...而且毫无意义.

  • 其他未经检查的异常被明确声明为thrown,或被记录为在方法或构造函数的javadoc中抛出.(事实上​​,我会说一个设计良好的API 应该记录它希望抛出或传播的未经检查的异常.)

  • 在问题情况下,在运行时看到异常之前,您不会知道它.

最后一个案例说明了在开发周期中需要彻底和可重复的测试.


但是当我不知道一个方法抛出一个自定义的未经检查的异常时,我该如何处理呢?

一般来说,你没有.

任何意外的异常都应被视为错误.您可以在测试中或在生产中找到它.你搞定了.如果你已经正确地修复了它,那么意外的异常就不会再发生......或者它现在是预期的,你的代码会处理它.

结果是,如果你捕获并处理一个意外的异常,那么你的代码假装没有发生任何不良事件是一个非常糟糕的主意.至少,需要记录异常,以便程序员可以使用某些东西来查找根本原因.


那么如何将异常从数据层传播到用户界面?

通常,向用户显示异常(尤其是堆栈跟踪!)是一个坏主意.通常情况下,你抓住它们,将它们与堆栈跟踪一起记录......然后告诉用户:"发生了一些不好的事情:请向XXX报告以下额外信息".

那些必须检查例外,对吗?

模数以上...不.他们不必被检查例外.


我会让数据层抛出已检查的DataLayerExceptions,然后在presenter类中有一个try-catch-block(假设我正在使用MVP),然后在catch-block中设置视图上的错误消息.

你可以这样做.模块化关于向用户显示例外的观点.

显然,如果您打算采用这种方法,您需要能够区分可以向用户解释的预期异常,处理和"继续"与无法解释且无法恢复的意外异常.你可能有一些方案可以做到这一点......


最重要的是,没有简单的公式或"最佳实践"可以为您解决这个问题.它需要思考和设计......并且关心......和测试.