如何在JavaScript中抛出“富有表现力”/控制台友好的异常?

How to throw "expressive" / console friendly exceptions in JavaScript?

提问人:aioobe 提问时间:5/4/2022 更新时间:5/7/2022 访问量:947

问:

JavaScript 菜鸟在这里...我正在探索抛出异常的各种选项。

抛出字符串/原始值

这似乎是不好的做法,原因有几个(捕获、堆栈跟踪......

Error

throw new Error("bad times")

这似乎是一种常见的方法,但我不是忠实的粉丝,因为我无法轻松添加额外的信息。例如,我不能这样做

throw new Error("bad times", { reason: strangeObject })

我可以提供额外的信息,但我喜欢在控制台中展开/折叠对象。JSON.stringify

据我所知,我不会在自定义异常/错误子类方面走得更远。

{ msg: "bad times", reason: strangeObject }

这使我可以在控制台中很好地展开/折叠。为了使整个应用程序中的例外情况保持一致,我需要到处重复该部分,我不喜欢这部分。strangeObjectmsg:

我最终选择了最后一种方法,只是为了发现 ESLinter 抱怨这种方法:

预期会引发错误对象no-throw-literal

所以,我的问题基本上是:我可以以控制台友好的方式使用(或自定义子类),即支持展开/折叠吗?ErrorError

javascript ecmascript-2017 字稿 -eslint

评论

1赞 katniss 5/4/2022
AFAIK 不,这取决于浏览器想要如何显示 Error 对象,但在 Node.js 中,您可以轻松控制错误的显示方式。

答:

1赞 aioobe 5/7/2022 #1

我已经解决了一个自定义异常和一个处理程序:window.onerror

class MyAppError extends Error {
  constructor(msg, details) {
    super(msg)
    this.details = details
  }
}

window.onerror = function(message, source, lineno, colno, error) {
    if (error instanceof MyAppError) {
        console.error(message, error.details)
        return true
    }
    return false
}

function throwSomething() {
    throw new MyAppError("I made a mess", {
        someDetail: "a value",
        otherStuff: "another value"
    });
}

console.log("Hello World");
throwSomething();

(JSFiddle)

结果在Firefox和Chrome中看起来像这样,我对此非常满意。

enter image description here