返回空值与异常与合约



处理从数据库返回具有以下 3 个潜在结果的记录的可接受方法:

  1. Db 连接工作,查找用户并返回填充的用户对象
  2. db 连接工作正常,找不到用户,返回新的用户对象
  3. 数据库连接/查询失败...

我在很大程度上的目标是通过合同进行设计:

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,因为它实际上没有获得用户。
    • 优点:这完全清楚,找不到用户
    • 缺点:需要空检查
  • 在链上进一步抛出异常
    • 优点:明确说明操作未实现
    • 缺点:不尝试纠正发生问题的问题

我倾向于处理异常,因为它避免了数十亿美元的错误,并且在正常情况下也保持合同设计。

但是,我想知道是否有任何明显的陷阱,或者这是否是一种熟悉的情况,具有完善的解决模式。

我会抛出一个异常,让用户知道连接失败。返回 NULL 是我永远不会做的事情,因为您不会知道问题是什么。

我不知道如果您没有连接到数据库,为什么会返回"新用户对象"。您将无法保存用户。

我的选择是抛出异常

使用可选(请(。这明确了在数据库中找不到用户,并避免了NullPointerException。

  • 可选(用户(,如果在数据库中找到用户
  • 如果未找到用户,则为空
  • 如果出现错误,您有两种选择:
    • 通知客户端,以便它可以获得反馈并对此故障做出反应。在这种情况下,会引发异常并在适当的层中处理它。这应该是大多数应用程序的默认行为。
    • 将其隐藏给客户端,
    • 这不太常见,但有时客户端不在乎,或者您不想发布失败。在这种情况下,只需返回一个 Empty。

相关内容

  • 没有找到相关文章

最新更新