如何在 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 中的结果看起来像这样,我对此非常满意。
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 中的结果看起来像这样,我对此非常满意。