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

如何通过window.onunhandledrejection获取被拒绝Promise的文件及行号

如何通过window.onunhandledrejection获取Promise拒绝的源文件路径和行号

可以实现,但无法直接从onunhandledrejection回调的event参数中拿到源文件路径和行号,需要通过Promise被拒绝的原因(即event.reason)的栈追踪信息来解析。

具体实现步骤

  1. 获取拒绝原因的栈信息
    当Promise被拒绝时,如果拒绝的是一个Error实例,它的stack属性会包含完整的栈追踪字符串,里面就包含了触发拒绝的文件路径、行号和列号。

  2. 解析栈字符串提取位置信息
    不同浏览器的栈格式略有差异,但核心结构一致,我们可以通过正则表达式提取关键信息。

示例代码:

window.onunhandledrejection = function(event) {
  // 仅处理以Error实例拒绝的情况
  if (!(event.reason instanceof Error)) return;

  const stackLines = event.reason.stack.split('\n');
  // 跳过第一行(Error类型描述),取第二行作为调用位置
  const callSiteLine = stackLines[1]?.trim();
  if (!callSiteLine) return;

  // 适配两种常见的栈行格式:带括号和不带括号的情况
  const match = callSiteLine.match(/at .*?\((.*?):(\d+):(\d+)\)/) 
              || callSiteLine.match(/at (.*?):(\d+):(\d+)/);
  
  if (match) {
    const [, source, lineno, colno] = match;
    console.log('Promise拒绝详情:', {
      source,
      lineno: parseInt(lineno),
      colno: parseInt(colno),
      error: event.reason
    });
  }
};

关键说明

  • 开发者控制台之所以能直接显示位置,是因为浏览器内部自动解析了Error的stack属性并格式化展示,我们的代码就是模拟这个解析过程。
  • 如果Promise拒绝的不是Error实例(比如Promise.reject('出错了')),则无法获取栈信息。因此建议在业务代码中始终用Error实例来拒绝Promise,比如Promise.reject(new Error('出错了')),这样才能保留完整的错误上下文。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:20:22