Serverpod服务端错误处理与抛出:如何返回错误模型(如ID不存在)
在Serverpod中返回自定义错误模型的实现方案
针对你提供的getBusiness方法,要在错误场景(如指定ID不存在、数据库异常)返回错误模型,可按照以下步骤实现:
1. 定义可序列化的错误模型
Serverpod要求跨端传递的模型必须继承SerializableModel,先创建自定义错误类:
class BusinessError extends SerializableModel { final String message; final int? code; BusinessError({required this.message, this.code}); @override Map<String, dynamic> toJson() => { 'message': message, 'code': code, }; @override void fromJson(Map<String, dynamic> json) { message = json['message'] as String; code = json['code'] as int?; } }
2. 修改方法返回类型与逻辑
将原方法的返回类型改为Result<List<Business>, BusinessError>(Serverpod内置的结果封装类),并在方法内处理不同错误场景:
Future<Result<List<Business>, BusinessError>> getBusiness(Session session, {int? id}) async { try { List<Business> businesses; if (id != null) { businesses = await Business.find( session, where: (t) => t.id.equals(id), ); // 指定ID但无匹配结果时返回错误 if (businesses.isEmpty) { return Result.error(BusinessError( message: '指定ID的商家不存在', code: 404, )); } } else { businesses = await Business.find(session); } return Result.success(businesses); } catch (e) { // 捕获数据库异常或其他运行时错误 return Result.error(BusinessError( message: '查询商家失败:${e.toString()}', code: 500, )); } }
3. 客户端处理结果
客户端调用时,可通过Result的状态判断来获取数据或错误信息:
var result = await client.business.getBusiness(id: 123); if (result.hasSuccess) { List<Business> businesses = result.success!; // 处理正常数据 } else { BusinessError error = result.error!; // 处理错误,比如提示用户error.message }
核心要点
- 使用Serverpod内置的
Result类统一封装成功/失败结果,避免直接抛出异常导致跨端调用问题 - 自定义错误模型需实现序列化,确保能在服务端与客户端之间正常传递
- 分场景处理错误:主动判断业务逻辑错误(如ID不存在),捕获全局异常处理系统级错误
内容的提问来源于stack exchange,提问作者Siyad Rahman
相关产品推荐
相关产品推荐

