Prisma忽略try/catch语句致服务崩溃,求解决方案
Prisma查询忽略try/catch的解决建议
以下是针对Prisma查询无法被try/catch捕获的排查和解决步骤:
确保外层函数是async函数
只有async函数内的await语句才能让try/catch捕获异步错误,如果包含这段查询的函数没有声明为async,await会失效,错误无法被捕获。示例:// 正确写法:外层函数必须加async async function getTableData() { try { await prisma.table.findMany({}); } catch (error) { console.error('捕获到查询错误:', error); await LogService.crearErrorLog(error); throw ClassToSendAnErrorWithPersonalization.internalServer('Some message'); } }先排查错误是否真的未被捕获
在catch块中添加控制台打印,确认错误是否进入了catch逻辑——有可能是LogService.crearErrorLog或自定义错误类的问题,导致你误以为try/catch被忽略:try { await prisma.table.findMany({}); } catch (error) { // 先打印错误,验证是否进入catch console.error('进入catch块,错误信息:', error); await LogService.crearErrorLog(error); throw ClassToSendAnErrorWithPersonalization.internalServer('Some message'); }检查Prisma客户端连接状态
若数据库连接本身存在问题,可能导致错误抛出逻辑异常。可以先手动测试连接:try { // 先验证连接是否正常 await prisma.$connect(); const data = await prisma.table.findMany({}); } catch (error) { console.error('连接或查询错误:', error); }排查全局错误拦截机制
检查项目中是否存在全局的Promise错误处理器(如process.on('unhandledRejection'))或框架级别的错误捕获(如Express的错误中间件),这些机制可能会吃掉错误,导致你看不到catch块的执行效果。规范.catch回调的错误抛出
如果你使用Promise链式调用的.catch,注意async回调中抛出的错误需要上层try/catch捕获,否则会成为未处理的Promise拒绝:async function getTableData() { try { await prisma.table.findMany({}).catch(async (error) => { console.error('回调捕获错误:', error); await LogService.crearErrorLog(error); // 抛出的错误会被外层try/catch捕获 throw ClassToSendAnErrorWithPersonalization.internalServer('Some message'); }); } catch (topError) { console.error('上层捕获回调抛出的错误:', topError); } }
内容的提问来源于stack exchange,提问作者sevila
相关产品推荐
相关产品推荐

