我们的代码中有许多 try-catch 块来处理 api 调用的异常。由于大多数 catch 块都是相同的,我们希望重构它们并且仅重构它们(因为 try 块应该保留在它们所在的位置)。这在 Flutter 中怎么可能?
示例代码:
try {
_userData = apiService.call("user_data");
} on ResourceNotFoundException {
handleResourceNotFoundException();
} on NetworkException {
handleNetworkException();
}
我发现的最佳解决方案是使用通用的
catch
,将所有内容放入 handleException
函数中,然后再次重新抛出异常。
try {
_userData = apiService.call("user_data");
} on catch (e) {
handleException(e);
}
void handleException(e) {
try {
throw e;
} on ResourceNotFoundException {
handleResourceNotFoundException();
} on NetworkException {
handleNetworkException();
}
}
这样就可以重用异常处理逻辑并扩展它。
您应该向 API 调用添加一些抽象,这意味着您应该添加一个函数,该函数接受您尝试调用的 API 调用作为参数,并用 try-catch 块包围它,并在那里处理所有异常。
这样您就可以将 API 调用逻辑与处理异常分开。
如果出现重复的 try catch 块,使用通用函数在一个地方处理错误也是一种方便的解决方案。
Future<T> _fetchDataAndHandleErrors<T>(Future<T> Function() callback) async {
try {
return await callback();
} on ResourceNotFoundException {
handleResourceNotFoundException();
} on NetworkException {
handleNetworkException();
}
...
}
在您的情况下,您将像这样调用
_fetchDataAndHandleErrors
函数:
Future<UserData> getUserData() async {
return await _fetchDataAndHandleErrors(
() async {
userData = apiService.call("user_data");
return userData;
},
);
}