Ilyen kódot már mindenki látott:
try { throw new Error('Oh, nooooo!'); } catch (e) { console.log(e.message); // Oh, nooooo! console.log(e instanceof Error); // true }
Ha nagyon sok hasonló keletkezik, akkor előbb-utóbb az ember rájön, hogy szükség lenne saját hiba osztályokra, még JavaScriptben is. Jó ötletnek tűnhet valahogy így létrehozni egyet:
function OhNoooError() { Error.call(this, "Oh, nooooo!"); this.name = "OhNoooError"; }
Az eredmény azonban meglepő lehet:
try { throw new OhNoooError(); } catch (e) { console.log(e.message); // undefined console.log(e instanceof OhNoooError); // true console.log(e instanceof Error); // false }
Az elkapott kivételünk ugyanis nem számít klasszikus Errornak (nem abból származik), és elveszítette a message tulajdonságát is.
Íme egy módszer, amivel ezeket a hibákat orvosolni lehet:
OhNoooError.prototype = Object.create(Error.prototype); OhNoooError.prototype.constructor = OhNoooError; function OhNoooError() { this.message = "Oh, nooooo!"; this.name = "OhNoooError"; }
A kimenet is szebb lesz:
try { throw new OhNoooError(); } catch (e) { console.log(e.message); // Oh, nooooo! console.log(e instanceof OhNoooError); // true console.log(e instanceof Error); // true }
A lényeg tehát, hogy a message tulajdonságot kézzel kell beállítani. Ha az öröklést esetleg CoffeeScriptben az extends kulcsszóval valósítjuk meg, a message tulajdonsággal akkor is manuálisan kell elbánnunk.