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

如何捕获Prisma交互式事务的错误?

捕获Prisma异常并避免应用崩溃

1. 用try/catch包裹Prisma操作

直接在调用Prisma数据库方法的代码块外层添加try/catch,确保异常被拦截而不扩散到应用全局:

async function getSingleUser(userId) {
  try {
    return await prisma.user.findUnique({
      where: { id: userId }
    });
  } catch (error) {
    // 转交给专门的错误处理逻辑
    return handleDbError(error);
  }
}

2. 针对性处理Prisma异常类型

Prisma定义了明确的错误分类,可根据类型和内置错误码做精细化处理:

function handleDbError(error) {
  // 已知请求错误(如唯一约束冲突、目标记录不存在)
  if (error instanceof Prisma.PrismaClientKnownRequestError) {
    switch (error.code) {
      case 'P2002':
        console.error('唯一字段重复:', error.meta.target);
        return { success: false, msg: '该资源已存在' };
      case 'P2025':
        console.error('请求的记录不存在');
        return { success: false, msg: '资源未找到' };
      default:
        console.error('数据库请求错误:', error.message);
        return { success: false, msg: '数据库操作失败' };
    }
  } 
  // 数据验证错误(字段类型不匹配、必填项缺失)
  else if (error instanceof Prisma.PrismaClientValidationError) {
    console.error('数据格式错误:', error.message);
    return { success: false, msg: '输入格式不符合要求' };
  } 
  // 其他未知异常兜底
  else {
    console.error('未知数据库异常:', error);
    return { success: false, msg: '服务器异常' };
  }
}

3. 全局异常兜底(Web应用场景)

如果是Express类Web框架,可添加全局错误中间件,捕获所有未被局部处理的异常:

// Express全局错误处理中间件
app.use((err, req, res, next) => {
  if (err instanceof Prisma.PrismaClientKnownRequestError) {
    let status = 500;
    let msg = '服务器错误';
    if (err.code === 'P2002') {
      status = 409;
      msg = '资源已存在';
    } else if (err.code === 'P2025') {
      status = 404;
      msg = '资源未找到';
    }
    res.status(status).json({ success: false, msg });
  } else {
    res.status(500).json({ success: false, msg: '服务器异常' });
  }
});

内容的提问来源于stack exchange,提问作者Andre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:31:10