【问题标题】:Best practice JavaScript rethrow preserving inner exception [duplicate]最佳实践 JavaScript 重新抛出保留内部异常 [重复]
【发布时间】:2021-02-16 12:43:39
【问题描述】:
function doFoo() {
    throw new Error("no foo for you");
}
    
try {
    doFoo();
} catch(e) {
    throw new Error("doFoo() for shame!", e);
}

在 JavaScript 中有什么健全的方法可以做到这一点?

我提出这个问题的特定用例的具体目标如下,按此顺序:

  1. 遵循标准,或至少遵循最佳做法
  2. 抛出一个新的异常/错误/任何你想调用它的东西(不仅仅是重新抛出我刚刚捕获的东西);从现在开始,我将把它称为例外
  3. 保留上一个异常中的消息(我想保留堆栈跟踪,但这对于此特定用例而言并不重要)
  4. 为之前的异常添加额外的元数据
  5. 保留上一个异常的堆栈跟踪(很高兴拥有,现在对我来说并不重要)

【问题讨论】:

  • 问题 - 你想抛出一个新消息的错误还是只是重新抛出?如果是后者就catch(e) { throw e }
  • 请重温问题的标题:我特别想保留内部异常。
  • 我找到的副本有点旧,但相信你正在寻找的一切。
  • @Bergi,不仅它很旧,而且它也不能满足我的第一个目标。请删除重复项。
  • @BogdanStăncescu 你怎么知道?我可以告诉你,ECMAScript 标准中没有实现这一点,并且副本中的所有库(以及它们可能更现代/流行的表亲)都遵循将内部错误包装为属性的最佳实践新错误。

标签: javascript exception


【解决方案1】:

一个简单的包装器怎么样?


class RootCause extends Error {
    constructor(message, error) {
        super(message);
        if (error) {
            this.cause = error;
        }
    }
}

function doFoo() {
    throw new RootCause("no foo for you");
}

try {
    doFoo();
} catch(e) {
    throw new RootCause("doFoo() for shame!", e)
}


/** Prints:
RootCause [Error]: doFoo() for shame!
    at Object.<anonymous> (/private/tmp/test.js:17:11)
    at Module._compile (internal/modules/cjs/loader.js:1138:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
    at Module.load (internal/modules/cjs/loader.js:986:32)
    at Function.Module._load (internal/modules/cjs/loader.js:879:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47 {
  cause: RootCause [Error]: no foo for you
      at doFoo (/private/tmp/test.js:11:11)
      at Object.<anonymous> (/private/tmp/test.js:15:5)
      at Module._compile (internal/modules/cjs/loader.js:1138:30)
      at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
      at Module.load (internal/modules/cjs/loader.js:986:32)
      at Function.Module._load (internal/modules/cjs/loader.js:879:14)
      at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
      at internal/main/run_main_module.js:17:47
**/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2011-07-29
    • 2011-07-12
    • 2019-02-22
    • 1970-01-01
    • 2010-12-02
    相关资源
    最近更新 更多