Flutter如何使用try-catch捕获API错误响应实现Toast提示
问题原因
- 接口返回非201业务错误状态码时,现有代码直接返回
null,没有抛出异常,外层try-catch只能捕获断网、超时这类网络层错误,无法拿到业务错误信息。 - 两层封装的
catch逻辑直接返回错误对象,吞掉了异常栈,上层调用方无法通过正常异常捕获流程拿到错误提示。
修复代码
1. 修改Service层逻辑
非201状态码时解析接口返回的错误体,主动抛出带提示文案的异常,不要吞错:
// companyService Future<Company> createCompany(Company company) async { try { final content = jsonEncode(company.toJson()); accessToken = await sharedPref.read(key); final requestUrl = "$baseUrl/company"; final response = await http.post( Uri.parse(requestUrl), body: content, headers: { "Content-Type": "application/json", "Authorization": "Bearer $accessToken", }, ); if (response.statusCode == 201) { return company; } // 解析接口返回的错误结构 final respJson = jsonDecode(response.body); // 抛出业务异常,把提示文案带出去 throw Exception(respJson['message'] ?? '创建失败,请稍后重试'); } catch (e) { // 所有捕获到的错误直接重新抛出,不要return e/return null吞掉 rethrow; } }
2. 简化Factory层逻辑
去掉无意义的try-catch包装,让异常自然向上透传给页面调用方:
// companyFactory Future<Company> createCompany( String name, String domain, String address, int cityId, ) async { final company = Company( name: name, domain: domain, address: address, cityId: cityId, ); final CompanyService service = CompanyService(); await service.createCompany(company); return company; }
3. 页面调用时捕获异常弹Toast
在提交创建的业务逻辑里,通过try-catch拿到异常后直接展示提示:
// 页面提交按钮点击逻辑 try { await companyFactory.createCompany( nameInput.text.trim(), domainInput.text.trim(), addressInput.text.trim(), selectedCityId ); // 创建成功逻辑:刷新列表、返回上一页等 Fluttertoast.showToast(msg: "公司创建成功"); } catch (err) { // 去掉Exception前缀后展示错误提示 final tip = err.toString().replaceFirst('Exception: ', ''); Fluttertoast.showToast(msg: tip); }
适配提示:如果你的接口返回的
message字段是数组、嵌套对象格式,只需要调整Service层的解析逻辑即可,比如数组类型的message可以用join('、')拼接成完整提示文案。
内容的提问来源于stack exchange,提问作者Emmon
相关产品推荐
相关产品推荐

