返回空与异常与合同
Returning Null vs Exception vs Contract
处理 return 具有以下 3 种潜在结果的 DB 记录的可接受方式是什么:
- Db 连接有效,找到一个用户和 return 一个填充的用户对象
- DB 连接有效,未找到用户,return新用户对象
- Db connection/query 失败...
我大部分时间都是以合同设计为目标的:
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();
}
}
在数据库连接或查询失败的情况下,我应该做什么不太明显,我有几个选择:
- Return一个新的用户对象,因为我们的方法已经同意return一个用户
- 亲:这坚持按合同设计
- 缺点:这让用户看起来好像不存在。
- Return null 因为它实际上并没有获得用户。
- 亲:很明显没有找到用户
- 缺点:需要空检查
- 抛出异常 进一步向上链。
- 优点:明确说明操作未实现
- 缺点:不尝试纠正发生的问题
我倾向于处理异常,因为它避免了数十亿美元的错误,并且在正常情况下也能按合同维护设计。
不过,我想知道是否存在任何明显的陷阱,或者这是否是一种熟悉的情况,并且有完善的模式来解决它。
我会抛出异常并让用户知道连接失败。返回 NULL 是我永远不会做的事情,因为你不会知道问题出在哪里。
我不知道为什么你会 return "New user object" 如果你没有连接到数据库。您将无法保存用户。
我的选择是抛出异常
使用可选(请)。这明确表示无法在数据库中找到用户并避免 NullPointerException。
- 可选(用户)如果在数据库中找到用户
- 如果找不到用户则为空
- 如果出现错误,您有两个选择:
- 通知客户端,以便它可以获得反馈并对这次失败做出反应。在这种情况下抛出一个异常并在适当的层处理它。这应该是大多数应用程序的默认行为。
向客户隐藏它,这种情况不太常见,但有时客户不关心或者您不想公布您的失败。在那种情况下,只是 return 一个空的。
处理 return 具有以下 3 种潜在结果的 DB 记录的可接受方式是什么:
- Db 连接有效,找到一个用户和 return 一个填充的用户对象
- DB 连接有效,未找到用户,return新用户对象
- Db connection/query 失败...
我大部分时间都是以合同设计为目标的:
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();
}
}
在数据库连接或查询失败的情况下,我应该做什么不太明显,我有几个选择:
- Return一个新的用户对象,因为我们的方法已经同意return一个用户
- 亲:这坚持按合同设计
- 缺点:这让用户看起来好像不存在。
- Return null 因为它实际上并没有获得用户。
- 亲:很明显没有找到用户
- 缺点:需要空检查
- 抛出异常 进一步向上链。
- 优点:明确说明操作未实现
- 缺点:不尝试纠正发生的问题
我倾向于处理异常,因为它避免了数十亿美元的错误,并且在正常情况下也能按合同维护设计。
不过,我想知道是否存在任何明显的陷阱,或者这是否是一种熟悉的情况,并且有完善的模式来解决它。
我会抛出异常并让用户知道连接失败。返回 NULL 是我永远不会做的事情,因为你不会知道问题出在哪里。
我不知道为什么你会 return "New user object" 如果你没有连接到数据库。您将无法保存用户。
我的选择是抛出异常
使用可选(请)。这明确表示无法在数据库中找到用户并避免 NullPointerException。
- 可选(用户)如果在数据库中找到用户
- 如果找不到用户则为空
- 如果出现错误,您有两个选择:
- 通知客户端,以便它可以获得反馈并对这次失败做出反应。在这种情况下抛出一个异常并在适当的层处理它。这应该是大多数应用程序的默认行为。
向客户隐藏它,这种情况不太常见,但有时客户不关心或者您不想公布您的失败。在那种情况下,只是 return 一个空的。