Noob de JavaScript aquí... Estoy explorando varias opciones para lanzar excepciones.
Esto parece ser una mala práctica por varias razones (captura, stacktrace, ...)
Error uso throw new Error("bad times")Este parece ser un enfoque común, pero no soy un gran admirador porque no puedo agregar información adicional fácilmente. no puedo por ejemplo hacer
throw new Error("bad times", { reason: strangeObject }) Podría JSON.stringify la información adicional, pero me gusta cuando puedo expandir/contraer el objeto en la consola.
Por lo que puedo decir, no avanzaré más con excepciones personalizadas/subclases de error.
{ msg: "bad times", reason: strangeObject } Esto me permite expandir/contraer strangeObject muy bien en la consola. Para que las excepciones a lo largo de mi aplicación sean consistentes, necesitaría repetir la parte msg: en todas partes, de lo cual no soy fanático.
Terminé optando por el último enfoque, solo para descubrir que ESLinter se queja de este enfoque:
Se esperaba que se lanzara un objeto de error
no-throw-literal
Entonces, mi pregunta es básicamente : ¿Puedo usar Error (o subclases de Error personalizadas) de una manera amigable para la consola, es decir, admitir expandir/colapsar?
Me he conformado con una excepción personalizada y un controlador 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 )
El resultado se ve así en Firefox y Chrome, con lo que estoy bastante contento.