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

使用try catch时如何获取详细错误日志?解决日志信息缺失问题

获取完整错误调用栈的解决方案

问题根源

你的代码存在两个核心问题,导致错误日志简略且丢失完整调用栈:

  1. 使用${err}仅输出错误的消息字符串,没有打印错误对象包含的完整调用栈信息。
  2. throw Error是创建了一个全新的空Error对象,完全丢失了原错误的上下文和调用栈。

具体修复方法

1. 正确打印完整错误日志

不要用模板字符串包裹err,直接将错误对象传入日志工具:

catch (err) {
    logger.error(err); // 直接传入错误对象,日志库会自动解析调用栈
    // ...
}

绝大多数主流日志库(如Winston、Pino)都支持直接处理Error对象,自动输出错误消息、调用栈等完整信息。

如果你的日志工具不支持直接解析Error对象,可以手动打印错误的stack属性:

catch (err) {
    logger.error(err.stack); // 直接输出完整调用栈
    // 也可以同时打印错误消息和调用栈
    logger.error(`错误详情: ${err.message}\n调用栈:\n${err.stack}`);
}

2. 正确抛出错误以保留调用栈

不要新建空Error,而是直接抛出原错误,或基于原错误包装新错误以保留调用链:

  • 直接抛出原错误:
catch (err) {
    logger.error(err);
    throw err; // 抛出原错误,完整保留调用栈
}
  • 包装错误并保留原调用链(如需添加自定义提示):
catch (err) {
    logger.error(err);
    // 用原错误作为cause传入,保留调用链
    throw new Error('处理数据时发生异常', { cause: err });
}

额外处理:解决未捕获Promise拒绝

你看到的ERR_UNHANDLED_REJECTION提示,说明存在未被捕获的Promise拒绝。确保所有异步操作都被正确捕获:

  • 若使用async/await,确保在try/catch内执行异步操作:
async function processData() {
    try {
        await yourAsyncTask();
    } catch (err) {
        logger.error(err);
        throw err;
    }
}
  • 若使用普通Promise,添加.catch()处理:
yourAsyncTask().catch(err => {
    logger.error(err);
});

内容的提问来源于stack exchange,提问作者Mehmet Yağız Maktav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:55:37