【发布时间】:2018-10-25 08:07:56
【问题描述】:
从数据库返回记录的可接受的处理方式有以下 3 种潜在结果:
- Db 连接有效,找到用户并返回填充的用户对象
- Db 连接有效,未找到用户,返回新用户对象
- 数据库连接/查询失败...
我的主要目标是按合同设计:
class Scratch {
public User getUser(int id) {
try {
// Prepare SQL Query
PreparedStatement s = this.connection.prepareStatement(
"select * from get_user(?)"
);
// Provide SQL Parameters
s.setInt(1, id);
// Run our SQL
ResultSet rs = s.executeQuery();
rs.next();
// Extract data into Entity
User user = User.createFromDatabase(rs);
rs.close();
return user;
} catch(Exception e) {
e.printStackTrace();
}
return new User();
}
}
在数据库连接或查询失败的情况下,我应该做什么不太明显,我有几个选择:
-
返回一个新的用户对象,因为我们的方法已经同意返回一个用户
- 专业人士:坚持按合同设计
- 缺点:这使它看起来用户不存在。
-
返回 null,因为它实际上并没有获得用户。
- 专业人士:很明显,找不到用户
- 缺点:需要空检查
-
抛出异常进一步向上链。
- 专业版:明确说明未完成操作
- 缺点:不会尝试纠正发生的问题
我倾向于处理异常,因为它避免了数十亿美元的错误,并且在正常情况下也保持了合同设计。
但是,我想知道是否存在任何明显的缺陷,或者这是否是一种熟悉的情况,并且有一个成熟的模式来解决它。
【问题讨论】:
-
getUser应该只做一件事,就是获取用户。如果它不能,它应该抛出一个异常。对我来说,返回 null 给人的印象是用户不存在。相关:stackoverflow.com/questions/77127/when-to-throw-an-exception -
@Ivar 谢谢我现在更新了,我在 IntelliJ 中打开了一个新的暂存文件并粘贴了一些代码。
标签: java exception-handling null design-by-contract