You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:52:27