我很难理解如何处理未经检查的异常.
如果方法没有声明异常并且我没有被强制处理它,我怎么知道该方法抛出异常?
未经检查的异常是针对编程错误的,正如我已经阅读过的,所以为了避免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,这是一个运行时异常.
我知道这个,因为我查看了方法签名.
现在,我将如何处理此异常?当然,用户需要某种类型的反馈,以防出现问题.当然,我会记录异常.
但是我会在哪里捕获这个例外?
我应该在那里抓住它,然后重新抛出我自己的未经检查的异常吗?或者我应该DataAccessException在findAll方法上声明一个抛出然后处理调用类中的异常(可能是某种服务或演示者)?
或者我应该确保抛出异常的条件永远不会发生(如果那些甚至可以被我控制)?
我很难理解如何处理未经检查的异常.
怎么这么容易.您处理它们就像检查异常一样.你使用try/catch.(如果你想要检查异常RuntimeException,要抓住它们,捕获或捕获Exception.但要注意捕获Error或Throwable捕获比预期更多的异常,否则你可以实际处理..)
你真正要问的是如何知道什么时候会抛出它们.这更难.
正如您所观察到的,语言本身会抛出一些未经检查的异常.从理论上讲,编写代码是可能的,这样就不会发生.在实践中:1)人们犯错误; 2)过多的防守检查是繁重的...而且毫无意义.
其他未经检查的异常被明确声明为thrown,或被记录为在方法或构造函数的javadoc中抛出.(事实上,我会说一个设计良好的API 应该记录它希望抛出或传播的未经检查的异常.)
在问题情况下,在运行时看到异常之前,您不会知道它.
最后一个案例说明了在开发周期中需要彻底和可重复的测试.
但是当我不知道一个方法抛出一个自定义的未经检查的异常时,我该如何处理呢?
一般来说,你没有.
任何意外的异常都应被视为错误.您可以在测试中或在生产中找到它.你搞定了.如果你已经正确地修复了它,那么意外的异常就不会再发生......或者它现在是预期的,你的代码会处理它.
结果是,如果你捕获并处理一个意外的异常,那么你的代码假装没有发生任何不良事件是一个非常糟糕的主意.至少,需要记录异常,以便程序员可以使用某些东西来查找根本原因.
那么如何将异常从数据层传播到用户界面?
通常,向用户显示异常(尤其是堆栈跟踪!)是一个坏主意.通常情况下,你抓住它们,将它们与堆栈跟踪一起记录......然后告诉用户:"发生了一些不好的事情:请向XXX报告以下额外信息".
那些必须检查例外,对吗?
模数以上...不.他们不必被检查例外.
我会让数据层抛出已检查的DataLayerExceptions,然后在presenter类中有一个try-catch-block(假设我正在使用MVP),然后在catch-block中设置视图上的错误消息.
你可以这样做.模块化关于向用户显示例外的观点.
显然,如果您打算采用这种方法,您需要能够区分可以向用户解释的预期异常,处理和"继续"与无法解释且无法恢复的意外异常.你可能有一些方案可以做到这一点......
最重要的是,没有简单的公式或"最佳实践"可以为您解决这个问题.它需要思考和设计......并且关心......和测试.
| 归档时间: |
|
| 查看次数: |
3040 次 |
| 最近记录: |