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

如何在Try Catch代码块中自定义SQL错误的返回提示内容

实现方案

方案1:通用业务错误标记法(不受ORM框架限制)

核心逻辑是给你主动抛出的业务类错误增加自定义标识,和系统/数据库抛出的内部错误做区分,catch时按类型返回对应提示:

try {
        const event = await Event.findByPk(event_id);
        if (!event) {
            // 给业务错误加自定义标识,区分内部错误
            throw Object.assign(Error("Event not found"), { isBusinessError: true });
        }
        await Event.update({ name:name, date:date }, {
            where: {
            id: event.id
            }
        });
}
catch(error) {
        // 主动抛出的业务错误,返回原始提示
        if (error.isBusinessError) {
            return res.status(400).json({status: "error", message: error.message});
        }
        // 其余所有内部错误(含SQL错误)统一返回通用提示,状态码用服务端错误500更符合HTTP规范
        return res.status(500).json({status: "error", message: "Internal Server error"});
}
    
return res.json({
        status: "success"
});

方案2:精准识别数据库错误(适配Sequelize等ORM框架)

如果你使用的是Sequelize作为ORM,所有数据库相关错误都会携带统一的名称前缀,你可以直接通过错误名判断,不需要修改原有抛出错误的逻辑:

try {
        const event = await Event.findByPk(event_id);
        if (!event) {
            throw Error("Event not found");
        }
        await Event.update({ name:name, date:date }, {
            where: {
            id: event.id
            }
        });
}
catch(error) {
        // 判断是否为Sequelize抛出的数据库相关错误
        if (error.name && error.name.startsWith('Sequelize')) {
            return res.status(500).json({status: "error", message: "Internal Server error"});
        }
        // 业务错误正常返回
        return res.status(400).json({status: "error", message: error.message});
}
    
return res.json({
        status: "success"
});

两种方案的适用场景:

  • 方案1适配所有场景,即使后续更换ORM框架也不需要修改错误处理逻辑
  • 方案2不需要修改原有业务抛错代码,适合已经有大量业务抛错逻辑的存量项目

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:15:08