Estoy tratando de implementar un manejo de errores que cuando una función genera un error, la función de llamada debe detectar ese error y agregarle información, para que el problema sea más fácil de entender. En el siguiente ejemplo, trato de explicar mis dudas. La first y la second función son llamadas por la third , y cada una de ellas genera errores diferentes, con información diferente. Me gustaría que la third función pueda detectar estos errores y adjuntarles información (la forma en que se implementa actualmente el ejemplo pierdo la información que first y second adjuntaron al error).
class FirstError extends Error { constructor(msg, num) { super(msg); this.num = num; } } class SecondError extends Error { constructor(msg, str) { super(msg); this.str = str; } } class ThirdError extends Error { constructor(msg, arg) { super(msg); this.arg = arg; } } function first(num) { throw new FirstError('First error', num); } function second(num) { throw new SecondError('Second error', num.toString()); } function third(fn) { try { fn(25); } catch (error) { throw new ThirdError('Third error', fn); } } try { third(first); third(second); } catch (error) { console.log(error); console.log(error instanceof Error); console.log(error instanceof FirstError); console.log(error instanceof SecondError); console.log(error instanceof ThirdError); console.log(error.message); console.log(error.stack); } También entiendo que podría probar las instancias del error recibido en el third , como el ejemplo a continuación. Sin embargo, como tendré varias funciones que devuelven errores, este enfoque no sería interesante ya que me quedaría con demasiadas pruebas y tendría que actualizar la tercera función con cada nuevo tipo de error agregado.
function third(fn) { try { fn(25); } catch (error) { if (error instanceof FirstError) { throw new ThirdError('Third error', fn); } else if (error instanceof SecondError) { throw new ThirdError('Third error', fn); } } }¿Alguna idea de cómo resolver este problema?
Puede pasar el error original al ThirdError. Entonces puedes acceder a ese error, por ejemplo
... class ThirdError extends Error { constructor(msg, ...args) { super(msg); this.arg = args[0]; this.innerError = args.slice(1); } } ... function third(fn) { try { fn(25); } catch (error) { throw new ThirdError('Third error', fn, error); } }Producción:
ThirdError: Third error ..., innerError: [ FirstError: First error ... { num: 25 } ] } ...