调试过程中最大的挑战是什么?其中之一无疑是追查错误的根源。
想象一下这个场景:
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); } };
通过这种方法,您可以更轻松地定位错误的根源。然而,这个解决方案有几个限制:
错误详细信息丢失:
如果错误包含大量信息(例如有效负载、HTTP 状态代码、错误代码),则此方法仅将 doSth 的错误消息添加到新构造的错误中。其他重要细节(包括原始堆栈跟踪)都会丢失。
日志可读性降低:
如果潜在错误点超过两个,日志可能会变得混乱且难以解释。
表达意图不明确:
代码没有明确表明新错误是由捕获的特定 doSth 函数引起的,为提高代码可读性留下了空间。
为了解决这些问题,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'); };
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 是用于 Web 托管、异步任务和 Redis 的下一代无服务器平台:
多语言支持
免费部署无限个项目
无与伦比的成本效率
简化的开发者体验
轻松的可扩展性和高性能
在文档中探索更多内容!
在 X 上关注我们:@LeapcellHQ
阅读我们的博客
以上是JavaScript 调试中的隐藏宝石:error.cause的详细内容。更多信息请关注PHP中文网其他相关文章!