面试题答案
一键面试- 使用
try - catch
块:- 在Flutter中调用RESTful API通常使用
http
库。在发起HTTP请求的代码处使用try - catch
块来捕获可能出现的异常。
import 'package:http/http.dart' as http; Future<void> fetchData() async { try { final response = await http.get(Uri.parse('your_api_url')); if (response.statusCode == 200) { // 处理成功响应 print('Success: ${response.body}'); } else { // 处理服务器错误,例如404, 500等 handleServerError(response.statusCode); } } catch (e) { // 处理网络错误等其他异常 handleNetworkError(e); } }
- 在Flutter中调用RESTful API通常使用
- 处理网络错误:
- 网络错误可能由多种原因引起,如无网络连接、超时等。在
catch
块中捕获到异常后,可以根据异常类型给出相应提示。
void handleNetworkError(Object e) { if (e is SocketException) { // 无网络连接等网络相关异常 showUserError('网络连接出现问题,请检查网络设置'); } else if (e is TimeoutException) { // 超时异常 showUserError('请求超时,请稍后重试'); } else { // 其他网络相关异常 showUserError('网络错误,请稍后重试'); } }
- 网络错误可能由多种原因引起,如无网络连接、超时等。在
- 处理服务器错误:
- 根据不同的HTTP状态码向用户反馈不同的错误信息。
void handleServerError(int statusCode) { switch (statusCode) { case 404: showUserError('请求的资源未找到'); break; case 500: showUserError('服务器内部错误,请稍后重试'); break; default: showUserError('服务器错误,状态码:$statusCode'); break; } }
- 向用户反馈错误信息:
- 可以使用Flutter的
ScaffoldMessenger
来显示SnackBar向用户反馈错误信息。
void showUserError(String errorMessage) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(errorMessage)), ); }
- 可以使用Flutter的
另外,还可以考虑封装错误处理逻辑到一个单独的服务或类中,以便在整个应用中复用。例如:
class ErrorHandler {
void handleError(Object error) {
if (error is http.Response) {
handleServerError(error.statusCode);
} else {
handleNetworkError(error);
}
}
void handleNetworkError(Object e) {
// 网络错误处理逻辑
}
void handleServerError(int statusCode) {
// 服务器错误处理逻辑
}
}
在调用API的地方使用这个ErrorHandler
:
Future<void> fetchData() async {
final errorHandler = ErrorHandler();
try {
final response = await http.get(Uri.parse('your_api_url'));
if (response.statusCode == 200) {
// 处理成功响应
} else {
errorHandler.handleError(response);
}
} catch (e) {
errorHandler.handleError(e);
}
}