例如,我有一個方法
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 塊更多的邏輯,以便該函式做一件事:處理錯誤。建議:不要使用嵌套的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
}
}
但它并不總是有效。那么,什么是更好的呢?
uj5u.com熱心網友回復:
unclebob 的建議是,在 try 或 catch 塊中沒有陳述句串列。相反,您應該將“正常”情況與例外情況分開。目標是分離不同的抽象級別。
為避免名稱沖突,我經常在“正常”大小寫前加上“嘗試”字樣。我也經常用自己的方法將 try/catch 分開以保持重點。例如
“處理”方法應該關注“處理用戶(userId)”的含義。它是一個抽象級別,如果將其與其他方法分開,則更易于閱讀和理解。
void process(String userId) {
User user = getUserById(userId);
loadAnalytics(user);
}
getUserById 僅關注您想要通過其 id 獲取用戶時所需的邏輯。
void void getUserById(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");
return user;
}
要了解“程序”方法,不必了解加載分析會導致例外狀態,甚至是它們的處理方式。
但是,當您深入研究 loadAnalytics 方法時,您想知道它是如何作業的。現在您可以立即看到加載分析可能會導致例外狀態。該方法專注于例外處理,因為它只包含 try/catch 并且您還關注可能發生的例外型別。
void loadAnalytics(User user){
try {
tryLoadAnalytics(user);
} catch(AnalyticsAPIException e) {
handleAnalyticsError(e);
}
}
我經常使用“try”前綴來避免名稱沖突并明確方法可能會失敗。
void tryLoadAnalytics(){
DataResponse response = callApi(userId, user.getDob(), user.getFirstName());
//logic
}
與“正常”情況一樣,例外處理是分開的,因此您可以專注于如何處理特定例外。
void handleAnalyticsError(AnalyticsAPIException e){
//logic
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/465276.html
