如何在 JavaScript 中抛出 "expressive" / 控制台友好异常?

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

JavaScript 新手...我正在探索抛出异常的各种选项。

抛出字符串/原始值

出于多种原因(捕获、堆栈跟踪等),这似乎是一种不好的做法

使用Error

throw new Error("bad times")

这似乎是一种常见的方法,但我不是很喜欢,因为我不能轻易添加额外的信息。例如我不能做

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

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

据我所知,自定义异常/错误子类不会再深入了。

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

这让我可以在控制台中很好地展开/折叠 strangeObject。为了使整个应用程序中的异常保持一致,我需要在所有地方重复 msg: 部分,我不喜欢这样。

我最终采用了最后一种方法,只是发现 ESLinter 抱怨这种方法:

Expected an error object to be thrown no-throw-literal

所以,我的问题基本上是:我可以使用控制台友好的方式使用 Error(或自定义 Error 子类),即支持 expand/collapse?

我已经解决了自定义异常和 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 中的结果看起来像这样,我对此非常满意。