如何在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
相关产品推荐
相关产品推荐

