Error
Az Error
objektumok futásidejű hiba során keletkeznek. Továbbá ezek az alapjai a saját készítésű hibaobjektumoknak is. Később olvashatsz a beépített hiba típusokról is.
Leírás
A futásidejű hibák során Error
objektumok keletkezhetnek, illetve érkezhetnek.
Hiba típusok
A generikus Error
konstruktor mellett, A JavaScript-ben más hiba konstruktorok is léteznek. A kliens-oldali kivételek listájához, lásd, a Kivételek kezelése fejezetet.
EvalError
- Egy olyan hibaobjektum példányát hozza létre, ami az
eval()
globális függvénnyel kapcsolatos. RangeError
- Egy olyan hibaobjektum példányát hozza létre, ami akkor történik, ha valamelyik szám típusú változó az érvényes értékkészleten kívűlre esik.
ReferenceError
- Egy olyan hibaobjektum példányát hozza létre, ami akkor történik, ha érvénytelen hivatkozásra történik hivatkozás.
SyntaxError
- Egy olyan hibaobjektum példányát hozza létre, ami egy szintaktikai hibát jelez.
TypeError
- Egy olyan hibaobjektum példányát hozza létre, ami akkor keletkezik, ha a változó, vagy paraméter típusa nem megfelelő, vagy érvénytelen.
URIError
- Egy olyan hibaobjektum példányát hozza létre, ami akkor keletkezik, ha az
encodeURI()
, vagy adecodeURI()
függvények érvénytelen bemeneti paramétereket kapnak. AggregateError
- Egy olyan hibaobjektum példányát hozza létre, ami egyszerre több hibát foglal magába. Ilyen objektum akkor jön létre, amikor egy függvényben egyidejűleg több hiba is történik. Például.:
Promise.any()
. InternalError
- Egy olyan hibaobjektum példányát hozza létre, ami akkor jön létre, amikor a JavaScript motorjában belső hiba keletkezik. Pl.: "too much recursion" ("Túl sok rekurzió").
Konstruktor
Error()
- Egy új
Error
objektumot hoz létre.
Statikus függvények
Error.captureStackTrace()
- Egy nem-standard V8 függvény, ami létrehoz egy
stack
tagváltozót az Error példányon.
Példány tagváltozói
Error.prototype.message
- Rövid hibaüzenet.
Error.prototype.name
- A hiba neve.
Error.prototype.description
- Egy nem-standard Microsoft tagváltozó a hiba leírásához. Hasonlít a
message
-hez. Error.prototype.number
- Egy nem-standard Microsoft tagváltozó a hiba számához.
Error.prototype.fileName
- Egy nem-standard Mozilla tagváltozó, ami a hibát okozó fájl útvonalát tartalmazza.
Error.prototype.lineNumber
- Egy nem-standard Mozilla tagváltozó, ami a hibát okozó fájl azon sorát jelöli, ahonnan a hiba származik.
Error.prototype.columnNumber
- Egy nem-standard Mozilla tagváltozó, ami a hibát tartalmazó sor azon oszlopát (karakterét) jelöli, ahonnan a hiba származik.
Error.prototype.stack
- Egy nem-standard Mozilla tagváltozó ami a stacktrace-t tartalmazza (A hiba nyomonkövetése a veremen).
Példány függvények
Error.prototype.toString()
- Egy string-gel tér vissza, ami leírja az objektumot. Ez a függvény felüldefiniálja a
Object.prototype.toString()
fügvényt.
Példák
Generikus hiba keletkezése
Az Error
objektumot általában akkor érdemes létrehozni, ha azt utána használjuk, vagy eldobjuk a throw
kulcsszó segítségével. Az ilyen hibákat a try...catch
szerkezettel lehet könnyedén kezelni:
try {
throw new Error('Whoops!')
} catch (e) {
console.error(e.name + ': ' + e.message)
}
Különleges hibák kezelése
A hiba objektum constructor
tagváltozójával, illetve modern JavaScript motor használata esetén, a instanceof
kulcsszóval lehetséges a hiba objektum konkrét típusát is lekérdezni. Ezzel leszűkíthető a hibakezelés konkrét hibatípusokra:
try {
foo.bar()
} catch (e) {
if (e instanceof EvalError) {
console.error(e.name + ': ' + e.message)
} else if (e instanceof RangeError) {
console.error(e.name + ': ' + e.message)
}
// ... etc
}
Saját hiba típusok
Elképzelhető, hogy saját hibatípust szereténk készíteni, ami az Error
objektumból származik. Ezáltal tudjuk használni a throw new MyError()
kifejezést a hiba jelzéséhez, és az instanceof MyError
-t a különleges hiba kezeléséhez. Ezzel biztosítható a szebb és konzisztensebb hibakezelés.
A kérdéskörről olvashatsz bővebben a "What's a good way to extend Error in JavaScript?" című téma alatt a StackOverflow fórumán.
ES6 Saját Error Osztály
7-es, vagy régebbi Babel verziók képesek a CustomError
osztályfüggvények kezelésére, de csak akkor, ha azokat at Object.defineProperty()-vel megfelelően deklarálták. Máskülönben, a Babel régebbi verziói és más fordítók nem tudják kezelni az alábbi kódrészletet hozzáadott konfiguráció nélkül.
Egyes böngészőkben előfordul a CustomError
konstruktor a stacktrace-ben, ha ES2015-ös osztályokat használunk.
class CustomError extends Error {
constructor(foo = 'bar', ...params) {
// Pass remaining arguments (including vendor specific ones) to parent constructor
super(...params)
// Maintains proper stack trace for where our error was thrown (only available on V8)
if (Error.captureStackTrace) {
Error.captureStackTrace(this, CustomError)
}
this.name = 'CustomError'
// Custom debugging information
this.foo = foo
this.date = new Date()
}
}
try {
throw new CustomError('baz', 'bazMessage')
} catch(e) {
console.error(e.name) //CustomError
console.error(e.foo) //baz
console.error(e.message) //bazMessage
console.error(e.stack) //stacktrace
}
ES5 Saját Error Objektumok
Minden böngészőben előfordul a CustomError
konstruktor a stacktrace-ben, ha prototípus alapján deklaráljuk azt.
function CustomError(foo, message, fileName, lineNumber) {
var instance = new Error(message, fileName, lineNumber);
instance.name = 'CustomError';
instance.foo = foo;
Object.setPrototypeOf(instance, Object.getPrototypeOf(this));
if (Error.captureStackTrace) {
Error.captureStackTrace(instance, CustomError);
}
return instance;
}
CustomError.prototype = Object.create(Error.prototype, {
constructor: {
value: Error,
enumerable: false,
writable: true,
configurable: true
}
});
if (Object.setPrototypeOf){
Object.setPrototypeOf(CustomError, Error);
} else {
CustomError.__proto__ = Error;
}
try {
throw new CustomError('baz', 'bazMessage');
} catch(e){
console.error(e.name); //CustomError
console.error(e.foo); //baz
console.error(e.message); //bazMessage
}
Specifikációk
Böngészőkompatibilitás
BCD tables only load in the browser