【发布时间】:2022-04-26 13:12:56
【问题描述】:
例如,我有一个方法
void process(String userId) {
if(userId == null) throw new IlligalArgumentException(\"Usesr ID is required);
User user = userService.findUserById(userId);
if(user == null) throw new UserNotFoundException(\"User with ID: \"+ userId +\" not found\");
try {
DataResponse response = analyticsAPI.loadAnalytics(userId, user.getDob(), user.getFirstName());
//logic
} catch(AnalyticsAPIException e) {
//logic
}
}
-
IlligalArgumentException是未经检查例外 -
UserNotFoundException是未经检查例外 -
AnalyticsAPIException是检查例外我读到最好的做法是从 try 开始方法并以 catch 结束,而不是在一个方法中将 try-catch 块相乘。
首选异常而不是错误代码 我们更喜欢异常而不是错误代码 因为它们更明确。在处理 try/catch 时,我们 不应在函数中添加比 try / catch 块更多的逻辑,所以 该函数只做一件事:处理错误。建议:不要使用 嵌套尝试/捕获。
像这样的东西:
void process(String userId) { try { if(userId == null) throw new IlligalArgumentException(\"Usesr ID is required); User user = userService.findUserById(userId); if(user == null) throw new UserNotFoundException(\"User with ID: \"+ userId +\" not found\"); DataResponse response = analyticsAPI.loadAnalytics(userId, user.getDob(), user.getFirstName()); //logic } catch(AnalyticsAPIException e) { //logic } }但它看起来很奇怪。我在 try-catch 块内抛出异常,并希望它不会在 catch 中处理。我希望它将被抛出到调用该方法的服务之上。
接下来我可以做:
public void process(String userId) { try { if(userId == null) throw new IlligalArgumentException(\"Usesr ID is required); User user = userService.findUserById(userId); if(user == null) throw new UserNotFoundException(\"User with ID: \"+ userId +\" not found\"); DataResponse response = callApi(userId, user.getDob(), user.getFirstName()); //logic } private DataResponse callApi(String userId, Date dob, String firstName){ try { return analyticsAPI.loadAnalytics(userId, user.getDob(), user.getFirstName()); } catch(AnalyticsAPIException e) { //logic } }但它并不总是有效。那么,什么是更好的呢?
-
我相信最佳实践是推荐像您的第二个提案这样的代码。如果您不能使用第二个提议,那么您需要嵌套的 try-catch 块,并且没有真正的解决方法。
-
如果您想向调用者重新抛出某些类型的异常,您可以捕获最通用的
Exception e,并在catch 块中使用instanceof来检查刚刚捕获的异常的实际类型。然后,只需发出throw e如果它是您要重新抛出的异常类型。
标签: java exception architecture refactoring clean-architecture