首页 > web前端 > js教程 > JavaScript 调试中的隐藏宝石:error.cause

JavaScript 调试中的隐藏宝石:error.cause

DDD
发布: 2025-01-12 16:45:47
原创
686 人浏览过

A Hidden Gem in JavaScript Debugging: error.cause

调试的挑战

调试过程中最大的挑战是什么?其中之一无疑是追查错误的根源。

想象一下这个场景:

const func = () => {
  doSth('A');
  doSth('B');
};
登录后复制
登录后复制

当func抛出错误时,如何判断错误发生在哪一步?是由 doSth('A')、doSth('B') 还是 func 本身引起的?显然,该错误缺乏足够的上下文。

常见解决方案

解决此问题的常见方法可能如下所示:

const func = () => {
  try {
    doSth('A');
  } catch (error) {
    throw new Error('An error from A', error);
  }
  try {
    doSth('B');
  } catch (error) {
    throw new Error('An error from B', error);
  }
};
登录后复制
登录后复制

通过这种方法,您可以更轻松地定位错误的根源。然而,这个解决方案有几个限制:

  1. 错误详细信息丢失:

    如果错误包含大量信息(例如有效负载、HTTP 状态代码、错误代码),则此方法仅将 doSth 的错误消息添加到新构造的错误中。其他重要细节(包括原始堆栈跟踪)都会丢失。

  2. 日志可读性降低

    如果潜在错误点超过两个,日志可能会变得混乱且难以解释。

  3. 表达意图不明确:

    代码没有明确表明新错误是由捕获的特定 doSth 函数引起的,为提高代码可读性留下了空间。

引入error.cause

为了解决这些问题,ECMAScript 2022 引入了 error.cause。

此功能允许开发人员在创建新的错误对象时指定错误的根本原因。通过使用 error.cause,您可以建立错误链,从而更轻松地调试和跟踪问题的根本原因。

这是一个简单的例子:

try {
  // Some operation that may throw an error
} catch (error) {
  throw new Error('Something went wrong', { cause: error });
}
登录后复制

通过这种方法,您可以在错误之间建立因果联系。例如:

const func = () => {
  try {
    doSth('A');
  } catch (error) {
    throw new Error('An error from A', { cause: error });
  }
  try {
    doSth('B');
  } catch (error) {
    throw new Error('An error from B', { cause: error });
  }
};
登录后复制

这使我们能够捕获较低级别函数抛出的错误(例如,doSth('A')),抛出一个添加相关上下文的新错误(例如,“执行 doSth('A') 时发生错误” ),并保留原始错误详细信息(例如,“A 是非法参数。”)。

建立错误链

error.cause 的另一个优点是它能够创建链接错误链,使开发人员能够通过应用程序的多个层追溯问题:

const func = () => {
  try {
    try {
      try {
        doSth('A');
      } catch (error) {
        throw new Error('Error at depth 3', { cause: error });
      }
    } catch (error) {
      throw new Error('Error at depth 2', { cause: error });
    }
  } catch (error) {
    throw new Error('Error at depth 1', { cause: error });
  }
};

console.log(error.cause.cause); // Error at depth 3
登录后复制

在 Node.js 中,有原因的错误会在控制台中进行特殊处理。打印所有相关的错误堆栈:

const func = () => {
  doSth('A');
  doSth('B');
};
登录后复制
登录后复制

结论

  • 当您可以立即访问错误上下文和详细信息时,调试变得更加容易。
  • 实现这一目标的一种有效方法是使用 error.cause 功能采用“catch re throw with context”模式:
const func = () => {
  try {
    doSth('A');
  } catch (error) {
    throw new Error('An error from A', error);
  }
  try {
    doSth('B');
  } catch (error) {
    throw new Error('An error from B', error);
  }
};
登录后复制
登录后复制

这种方法不仅提高了错误可追溯性,还增强了代码的可读性和可维护性。


我们是 Leapcell,是将 Node.js 项目部署到云端的首选。

A Hidden Gem in JavaScript Debugging: error.cause

Leapcell 是用于 Web 托管、异步任务和 Redis 的下一代无服务器平台:

多语言支持

  • 使用 Node.js、Python、Go 或 Rust 进行开发。

免费部署无限个项目

  • 只需支付使用费用——无请求,不收费。

无与伦比的成本效率

  • 即用即付,无闲置费用。
  • 示例:25 美元支持 694 万个请求,平均响应时间为 60 毫秒。

简化的开发者体验

  • 直观的用户界面,轻松设置。
  • 完全自动化的 CI/CD 管道和 GitOps 集成。
  • 实时指标和日志记录以获取可行的见解。

轻松的可扩展性和高性能

  • 自动扩展,轻松处理高并发。
  • 零运营开销——只需专注于构建。

在文档中探索更多内容!

A Hidden Gem in JavaScript Debugging: error.cause

在 X 上关注我们:@LeapcellHQ


阅读我们的博客

以上是JavaScript 调试中的隐藏宝石:error.cause的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板