JavaScript noob here... I'm exploring various options for throwing exceptions.
This seems to be bad practice for several reasons (catching, stacktrace, ...)
Error
throw new Error("bad times")
This seems to be a common approach, but I'm not a big fan because I can't easily add extra information. I can't for example do
throw new Error("bad times", { reason: strangeObject })
I could JSON.stringify
the extra information, but I like when I can expand / collapse the object in the console.
From what I can tell I won't get any farther with custom exceptions / Error-subclasses.
{ msg: "bad times", reason: strangeObject }
This allows me to expand / collapse strangeObject
nicely in the console. For exceptions throughout my application to be consistent, I'd need to repeat the msg:
part everywhere, which I'm not a fan of.
I ended up going for the last approach, just to find out that the ESLinter complains about this approach:
Expected an error object to be thrown
no-throw-literal
So, my question is basically: Can I use Error
(or custom Error
subclasses) in a console-friendly way, i.e. support expand/collapse?
I've settled for a custom exception and a window.onerror
handler:
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)
Result looks like this in Firefox and Chrome, which I'm quite happy with.