Creé mi propio error al extender la clase Error :
class MyError extends Error { constructor(message) { super(message); this.name = this.constructor.name; } }Entonces el siguiente código:
throw new MyError('My Message');producirá la siguiente salida:
throw new MyError('My Message') ^ MyError: My Message <-- OUR MESSAGE at Object.<anonymous> (D:\GitHub\error-meta\main.js:1:7) at Module._compile (node:internal/modules/cjs/loader:1101:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10) at Module.load (node:internal/modules/cjs/loader:981:32) at Function.Module._load (node:internal/modules/cjs/loader:822:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) at node:internal/main/run_main_module:17:47 Podemos ver que My message se imprime entre la línea de código y el seguimiento de la pila.
¿Cómo debo extender la clase de Error para imprimir My message u otro texto antes de la salida de error estándar? Entonces se vería así:
My custom error context data! /* ... standart error output goes here ... */Si esto no es posible, ¿cómo reemplazar completamente el mensaje de error estándar? ¿De dónde viene?
Nota importante: ¡Quiero que esto se muestre en un throw no controlado, sin imprimir datos en el bloque de catch !
¿Cómo debo extender la clase de
Errorpara imprimir "Mi mensaje" u otro texto antes de la salida de error estándar?
Es posible que pueda hacer esto sobrescribiendo la propiedad de la stack :
class MyError extends Error { name = this.constructor.name; stack = 'My custom error context data!\n' + this.stack; } Sin embargo, no recomendaría hacer esto: .stack no es realmente estándar ( todavía ), puede o no ser utilizado por lo que realmente muestra el error , y no debe meterse con el captador mágico perezoso incorporado.
Si esto no es posible, ¿cómo reemplazar completamente el mensaje de error estándar? ¿De dónde viene?
Proviene de la propagación de errores de nodejs , que solo registra las excepciones no detectadas antes de finalizar el proceso. Puede anular este comportamiento predeterminado agregando un controlador de eventos uncaughtException en el process .
Sin embargo, en el caso de una aplicación CLI, simplemente no debe dejar la excepción sin manejar. Atrápelo con try / catch alrededor de su función principal, luego haga cualquier informe de error personalizado que le gustaría hacer y llame a process.exit .
Eche un vistazo al atributo de pila de la clase Error
class MyError extends Error{ constructor(message){ super(''); this.name = this.constructor.name; this.stack= message +" : "+ this.stack //also you can replace this with anything you want } } throw new MyError("This is my message");Entonces obtendrás algo como
This is my message : MyError at Object.<anonymous> (/home/runner/GummyAdmirableEvents/index.js:10:7) at Module._compile (node:internal/modules/cjs/loader:1101:14)No estoy seguro de si esto es lo que está buscando, pero puede consolar su propio error antes del estándar como este:
class MyError extends Error { constructor(message) { console.error(message) super(message); this.name = this.constructor.name; } }