Ù
ت٠ÙÙÙÙ ÙØ·ÙÙØ± Ø§ÙØ¨Ø±Ø§Ù
ج ÙØØªØ§Ø¬ Ø¥ÙÙ Ø£ØµÙØ§Ù أخطاء خاصة Ø¨ÙØ§ ÙØªÙØ¶ÙØ تÙ
اÙ
ÙØ§ Ù
ا ÙØ¯ ÙØØ¯Ø« خطأ٠Ù٠اÙÙ
ÙØ§Ù
Ø§ÙØªÙ ÙÙÙÙ
Ø¨ÙØ§. ÙÙ
Ø«ÙÙØ§ ÙØ£Ø®Ø·Ø§Ø¡
Ø§ÙØ´Ø¨ÙØ© ÙØ³ØªØ¹Ù
Ù HttpErrorØ ÙÙØ¹Ù
ÙÙØ§Øª ÙÙØ§Ø¹Ø¯ Ø§ÙØ¨ÙØ§ÙØ§Øª DbError ÙÙØ¹Ù
ÙÙØ§Øª Ø§ÙØ¨ØØ« NotFoundError ÙÙÙØ°Ø§.
ÙØ¹ÙÙ ÙØ°Ù Ø§ÙØ£Ø®Ø·Ø§Ø¡ أ٠تدعÙ
Ø§ÙØ®Ø§ØµÙات Ø§ÙØ£Ø³Ø§Ø³ÙØ© Ù
Ø«Ù Ø§ÙØ±Ø³Ø§ÙØ© message ÙØ§ÙاسÙ
name ÙØ§ÙÙ
ÙÙØ¯Ø³ stack (ÙÙØ¶Ù٠ذÙÙ)Ø
ÙÙÙÙ ÙÙ
ÙÙ Ø£Ù ØªØØªÙ٠عÙ٠خصائص أخر٠خاصة Ø¨ÙØ§ Ù
Ø«Ù Ø®Ø§ØµÙØ© statusCode ÙÙØ§Ø¦Ùات HttpError ÙØªØÙ
Ù ÙÙÙ
Ø© Ù
Ù ÙÙÙ
رÙ
ÙØ² Ø§ÙØØ§ÙØ© 404 Ø£Ù 403 Ø£Ù 500.
ØªØªÙØ ÙÙØ§ Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت استعÙ
ا٠throw بتÙ
Ø±ÙØ± Ø£ÙÙ ÙØ³ÙØ·Ø ÙØ°Ø§ ÙØ£ØµÙØ§Ù Ø§ÙØ®Ø·Ø£ Ø§ÙØ®Ø§ØµØ© Ø¨ÙØ§ ÙÙ
Ù٠أÙÙØ§ ترث (تÙÙÙÙØ§) Ù
Ù ÙØ§Ø¦Ù Ø§ÙØ®Ø·Ø£
ErrorØ ÙÙÙÙ ÙÙ ÙØ±Ø«Ùا Ù
ÙÙØ§ ÙÙÙ
ÙÙÙ ÙÙØ¬Ù
ÙØ¹ استعÙ
ا٠obj instanceof Error ÙØ§ØÙÙØ§ ÙØªØªØ¹Ø±Ù٠عÙÙ ÙØ§Ø¦Ùات Ø§ÙØ®Ø·Ø£Ø بذÙÙ ÙÙÙÙ
Ø£ÙØ¶Ù ÙÙ ÙØ±Ø«ÙØ§ÙØ§.
ÙÙÙÙÙ
ا ÙØ¨Ø± Ø§ÙØªØ·Ø¨ÙÙ Ø´ÙÙÙØª Ø§ÙØ£Ø®Ø·Ø§Ø¡ Ø§ÙØªÙ Ø®ØµÙØµÙØ§ÙØ§ Ø´Ø¬Ø±Ø©Ø ÙÙ
Ø«ÙÙØ§ Ø³ÙØ±Ø« Ø§ÙØµÙÙ HttpTimeoutError Ø§ÙØµÙÙÙ
HttpErrorØ ÙÙÙØ°Ø§ Ø¯ÙØ§ÙÙÙ.
ØªÙØ³Ø¹Ø© Error
ÙÙØ£Ø®Ø° Ù
ثاÙÙØ§ Ø¯Ø§ÙØ©Ù readUser(json)â ØªÙرأ ÙØ§Ø¦Ù JSON ÙÙ Ø¨ÙØ§Ùات اÙÙ
ستخدÙ
.
ÙÙØ°Ø§ Ù
Ø«Ø§Ù Ø¹Ù ÙØ§Ø¦Ù json ØµØ§ÙØ:
let json = `{ "name": "John", "age": 30 }`;
Ø³ÙØ³ØªØ¹Ù
Ù ÙÙ Ø§ÙØ´ÙÙØ±Ø© Ø§ÙØªØ§Ø¨Ùع JSON.parseØ ÙØ¥Ù استÙÙ
ÙØ§Ø¦Ù json Ù
Ø¹Ø·ÙØ¨ رÙ
٠خطأ SyntaxError. ÙÙÙÙØ ØØªÙÙ ÙÙ
ÙØ§Ù اÙÙØ§Ø¦Ù صØÙØÙا ØµÙØ§ØºÙÙØ§Ø ÙÙØ§ ÙØ¹ÙÙ ÙØ°Ø§ Ø£Ù٠اÙÙ
ستخدÙ
ØµØ§ÙØÙØ§ Ø£ÙØ¶ÙØ§Ø Ø£Ù
ÙØ§Ø ÙØ±Ø¨ÙÙ
ا ÙØ§ ÙØØªÙ٠بعض Ø§ÙØ¨ÙØ§ÙØ§Øª Ù
Ø«Ù Ø®Ø§ØµÙØªÙ Ø§ÙØ§Ø³Ù
json ÙØ§ÙعÙ
ر name Ø§ÙØ¶Ø±ÙØ±ÙØªÙÙ ÙÙÙ
ستخدÙ
ÙÙ.
Ø¨ÙØ°Ø§ ÙÙ ØªÙØ±Ø£ Ø§ÙØ¯Ø§ÙØ© readUser(json)â ÙØ§Ø¦Ù JSON ÙØØ³Ø¨Ø Ø¨Ù Ø³ØªÙØØµ (âØªØªØÙÙÙ Ù
Ùâ) Ø§ÙØ¨ÙØ§ÙØ§ØªØ ÙÙÙ ÙÙ
تÙÙ Ø§ÙØÙÙ٠اÙÙ
Ø·ÙÙØ¨Ø©
Ù
ÙØ¬ÙØ¯Ø©Ø Ø£Ù ÙØ§Ù ØªÙØ³Ù٠اÙÙØ§Ø¦Ù Ù
غÙÙØ·ÙØ§Ø ÙÙÙØ§ ÙÙÙ٠أÙ
اÙ
خطأ⦠ÙÙØ°Ø§ Ø§ÙØ®Ø·Ø£ ÙÙØ³ Ø®Ø·Ø£Ù ØµÙØ§ØºÙÙØ§ SyntaxError إذ Ø£ÙÙ Ø§ÙØ¨ÙØ§ÙØ§Øª
صØÙØØ© ØµÙØ§ØºÙÙØ§Ø ب٠ÙÙØ¹ آخر Ù
Ù Ø§ÙØ£Ø®Ø·Ø§Ø¡. Ø³ÙØ³Ù
ÙÙ ÙØ°Ø§ اÙÙÙØ¹ ValidationError ÙÙØµÙع صÙÙ ÙÙ. عÙÙ ÙØ°Ø§ اÙÙÙØ¹ Ù
Ù
Ø§ÙØ£Ø®Ø·Ø§Ø¡ Ø§ØØªÙاء Ù
ا ÙÙØ²Ù
Ù
Ù Ù
عÙÙÙ
ات ØªØ®ØµÙ Ø§ÙØÙ٠اÙÙ
خاÙÙ.
ÙÙØªØ±Ø¶ عÙÙÙØ§ ÙØ±Ø§Ø«Ø© Ø§ÙØµÙ٠اÙÙ
ضÙ
ÙÙ Ù٠اÙÙØºØ© Error ÙØµÙÙÙØ§ ValidationError. Ø¥ÙÙÙ Ø´ÙØ¡ ع٠شÙÙØ±Ø© Ø§ÙØµÙ٠اÙÙ
ضÙ
ÙÙ
ÙÙØ¹Ø±Ù Ù
ا ÙØØ§ÙÙ ØªÙØ³Ø¹ØªÙ:
// Ø´ÙÙØ±Ø© Ù
Ø¨Ø³ÙØ·Ø© ÙØµÙÙ Ø§ÙØ®Ø·Ø£ â«Error اÙÙ
ضÙ
ÙÙ ÙÙ ÙØºØ© Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت ÙÙØ³Ùا
class Error {
constructor(message) {
this.message = message;
this.name = "Error"; // (تختÙÙ Ø§ÙØ£Ø³Ù
اء Ø¨Ø§Ø®ØªÙØ§Ù Ø£ØµÙØ§Ù Ø§ÙØ£Ø®Ø·Ø§Ø¡ اÙÙ
ضÙ
ÙÙØ©)
this.stack = <call stack>; // ÙÙØ³Øª ÙÙØ§Ø³ÙØ©Ø Ø¥ÙÙØ§ Ø£ÙÙ Ø£ØºÙØ¨ Ø§ÙØ¨Ùئات تدعÙ
ÙØ§
}
}
Ø§ÙØ¢Ù صار ÙÙØª Ø£Ù ÙØ±Ø« Ø§ÙØµÙÙ ValidationError Ù
ÙÙØ§:
class ValidationError extends Error {
constructor(message) {
super(message); // (1)
this.name = "ValidationError"; // خطأ ÙÙ Ø§ÙØªØÙÙÙ (2)
}
}
function test() {
throw new ValidationError("Whoops!"); // آخ
}
try {
test();
} catch(err) {
alert(err.message); // آخ!
alert(err.name); // خطأ ÙÙ Ø§ÙØªØÙÙÙ
alert(err.stack); // ÙØ§Ø¦Ù
Ø© Ù
Ù Ø§ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡Ø§Øª اÙÙ
ØªØ¯Ø§Ø®ÙØ© ÙÙ ÙÙÙ Ù
ÙÙØ§ رÙÙ
Ø§ÙØ³Ø·Ø±
}
ÙØ§ØØ¸ ÙÙ٠أÙÙÙØ§ ÙÙ Ø§ÙØ³Ø·Ø± (1) استدعÙÙØ§ Ø§ÙØ¨Ø§ÙÙ Ø§ÙØ£Ø¨Ø إذ ØªØ·ÙØ¨ Ù
ÙØ§ ÙØºØ© Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت استدعاء super ÙÙ Ø§ÙØ¨Ø§ÙÙØ§Øª Ø§ÙØ§Ø¨ÙØ©Ø Ø£Ù Ø£ÙÙÙ
Ø£Ù
ر Ø¥ÙØ²Ø§Ù
Ù. ÙØ¶Ø¨Ø· Ø§ÙØ¨Ø§ÙÙ Ø§ÙØ£Ø¨ Ø®Ø§ØµÙØ© Ø§ÙØ±Ø³Ø§ÙØ© message.
ÙÙ
ا ÙØ¶Ø¨Ø· Ø£ÙØ¶Ùا Ø®Ø§ØµÙØ© Ø§ÙØ§Ø³Ù
name ÙØªÙÙÙ "Error"Ø ÙÙØ°ÙÙ ÙÙØ¹Ø¯ÙÙÙØ§ Ø¥Ù٠اÙÙÙÙ
Ø© Ø§ÙØµØÙØØ© ÙÙ Ø§ÙØ³Ø·Ø± (2).
ÙÙÙØØ§ÙÙ Ø§ÙØ¢Ù استعÙ
اÙÙ ÙÙ readUser(json)â:
class ValidationError extends Error {
constructor(message) {
super(message);
this.name = "ValidationError"; // خطأ ÙÙ Ø§ÙØªØÙÙÙ
}
}
// Ø§ÙØ§Ø³ØªØ¹Ù
اÙ
function readUser(json) {
let user = JSON.parse(json);
if (!user.age) {
throw new ValidationError("No field: age"); // ØÙÙ ØºÙØ± Ù
ÙØ¬Ùد: Ø§ÙØ¹Ù
ر
}
if (!user.name) {
throw new ValidationError("No field: name"); // ØÙÙ ØºÙØ± Ù
ÙØ¬Ùد: Ø§ÙØ§Ø³Ù
}
return user;
}
// ÙÙØ§ ÙØ¬Ø±Ùب باستعÙ
ا٠try..catch
try {
let user = readUser('{ "age": 25 }');
} catch (err) {
if (err instanceof ValidationError) {
alert("Invalid data: " + err.message); // Ø§ÙØ¨ÙØ§ÙØ§Øª ØºÙØ± ØµØ§ÙØØ©: ØÙÙ ØºÙØ± Ù
ÙØ¬Ùد: Ø§ÙØ§Ø³Ù
} else if (err instanceof SyntaxError) { // (*)
alert("JSON Syntax Error: " + err.message); // â«Ø®Ø·Ø£ ØµÙØ§ØºÙ ÙÙØ§Ø¦Ù JSON
} else {
throw err; // خطأ ÙØ§ ÙØ¹Ø±ÙÙØ عÙÙÙØ§ إعادة رÙ
ÙÙ (**)
}
}
تتعاÙ
Ù ÙØªÙØ© try..catch ÙÙ Ø§ÙØ´ÙÙØ±Ø© Ø£Ø¹ÙØ§Ù اÙÙÙØ¹ÙÙ Ù
Ù Ø§ÙØ£Ø®Ø·Ø§Ø¡: ValidationError ÙØ§Ùخطأ اÙÙ
ضÙ
ÙÙ SyntaxError
Ø§ÙØ°Ù ÙØ±Ù
ÙÙ Ø§ÙØªØ§Ø¨Ùع JSON.parse.
ÙØ§ØÙظ Ø£ÙØ¶Ùا ÙÙ٠استعÙ
ÙÙØ§ instanceof ÙÙØØµ ÙÙØ¹ Ø§ÙØ®Ø·Ø£ ÙÙ Ø§ÙØ³Ø·Ø± (*).
ÙÙ
ÙÙÙØ§ Ø£ÙØ¶Ùا Ù
Ø·Ø§ÙØ¹Ø© err.name ÙÙØ°Ø§:
// ...
// بد٠â«(err instanceof SyntaxError)
} else if (err.name == "SyntaxError") { // (*)
// ...
ÙÙÙÙ٠استعÙ
ا٠instanceof Ø£ÙØ¶Ù Ø¨ÙØ«Ùر إذ ÙØØ¯Ø« ÙÙÙØ³Ùع Ù
Ø³ØªÙØ¨ÙÙØ§ Ø§ÙØµÙÙ ValidationError Ø¨Ø£ØµÙØ§Ù ÙØ±Ø¹ÙØ© Ù
ÙÙ Ù
Ø«Ù
PropertyRequiredErrorØ ÙØ§ÙÙØØµ عبر instanceof Ø³ÙØ¸ÙÙ ÙØ¹Ù
Ù ÙÙØ£ØµÙا٠اÙÙ
ÙØ±Ùثة Ù
ÙÙØ
ÙÙ
ا Ù
٠اÙÙ
ÙÙ
Ù Ø£Ù ØªÙØ¹Ùد ÙØªÙØ© catch رÙ
Ù Ø§ÙØ£Ø®Ø·Ø§Ø¡ Ø§ÙØªÙ ÙØ§ تÙÙÙ
ÙØ§Ø ÙÙ
ا ÙÙ Ø§ÙØ³Ø·Ø± (**). ÙÙØ³ عÙÙ ÙØ°Ù اÙÙØªÙØ© Ø¥ÙÙØ§ Ø§ÙØªØ¹Ø§Ù
Ù Ù
ع
أخطاء Ø§ÙØªØÙÙÙ ÙØ§ÙØµÙØ§ØºØ©Ø Ø£Ù
ÙØ§ باÙÙ Ø§ÙØ£Ø®Ø·Ø§Ø¡ (ÙØ§ÙØªÙ ÙØ¯ ØªØØ¯Ø« بسبب Ø§ÙØ£Ø®Ø·Ø§Ø¡ اÙÙ
Ø·Ø¨Ø¹ÙØ© ÙÙ Ø§ÙØ´ÙÙØ±Ø© Ø£Ù ØºÙØ±Ùا Ù
٠أÙ
ÙØ± ØºØ±ÙØ¨Ø© Ø¹Ø¬ÙØ¨Ø©)
ÙÙØ¬Ø¨ Ø£Ù ØªØ³ÙØ· Ø£Ø±Ø¶ÙØ§.
تع٠Ù٠اÙÙØ±Ø§Ø«Ø©
صÙÙ Ø§ÙØ®Ø·Ø£ ValidationError عاÙ
Ù Ø¬Ø¯ÙØ§ Ø¬Ø¯ÙØ§Ø إذ ÙÙ
ÙÙ Ø£Ù ØªØØµÙ Ø£Ù
ÙØ± ÙØ«Ùرة خطأ٠Ù٠خطأ. ÙØ±Ø¨ÙÙ
ا ÙØ§Ùت Ø§ÙØ®Ø§ØµÙØ© ØºÙØ±
Ù
ÙØ¬Ùدة Ø£Ù ÙØ§Ù ÙØ³ÙÙØ§ خطأ (Ù
Ø«Ù ØªÙØ¯ÙÙ
Ø³ÙØ³ÙØ© ÙØµÙØ© ÙÙÙ
ة٠ÙÙØ¹Ù
ر age). ÙÙØµÙع Ø§ÙØµÙÙ â¦. PropertyRequiredError
ÙÙØ³ØªØ¹Ù
ÙÙ ÙÙØ· ÙÙØ®Ø§ØµÙات ØºÙØ± اÙÙ
ÙØ¬ÙØ¯Ø©Ø ÙØ³ÙØØªÙ٠عÙ٠أÙÙØ© Ù
عÙÙÙ
ات إضاÙÙØ© Ø¹Ù Ø§ÙØ®Ø§ØµÙØ© اÙÙØ§Ùصة.
class ValidationError extends Error {
constructor(message) {
super(message);
this.name = "ValidationError"; // خطأ ÙÙ Ø§ÙØªØÙÙÙ
}
}
// ÙØ°Ø§
class PropertyRequiredError extends ValidationError {
constructor(property) {
super("No property: " + property); // Ø®Ø§ØµÙØ© ØºÙØ± Ù
ÙØ¬Ùدة
this.name = "PropertyRequiredError"; // خطأ إذ Ø§ÙØ®Ø§ØµÙØ© Ù
Ø·ÙÙØ¨Ø©
this.property = property;
}
}
// Ø§ÙØ§Ø³ØªØ¹Ù
اÙ
function readUser(json) {
let user = JSON.parse(json);
if (!user.age) {
throw new PropertyRequiredError("age"); // Ø§ÙØ¹Ù
ر
}
if (!user.name) {
throw new PropertyRequiredError("name"); // Ø§ÙØ§Ø³Ù
}
return user;
}
// ÙÙØ§ ÙØ¬Ø±Ùب باستعÙ
ا٠â«try..catch
try {
let user = readUser('{ "age": 25 }');
} catch (err) {
if (err instanceof ValidationError) {
alert("Invalid data: " + err.message); // Ø§ÙØ¨ÙØ§ÙØ§Øª ØºÙØ± ØµØ§ÙØØ©: Ø®Ø§ØµÙØ© ØºÙØ± Ù
ÙØ¬Ùدة: Ø§ÙØ§Ø³Ù
alert(err.name); // PropertyRequiredError
alert(err.property); // name
} else if (err instanceof SyntaxError) {
alert("JSON Syntax Error: " + err.message); // خطأ ØµÙØ§ØºÙ ÙÙØ§Ø¦Ù â«JSON
} else {
throw err; // خطأ ÙØ§ ÙØ¹Ø±ÙÙØ عÙÙÙØ§ إعادة رÙ
ÙÙ
}
}
ÙØ³ÙÙ٠عÙÙÙØ§ استعÙ
Ø§Ù Ø§ÙØµÙÙ Ø§ÙØ¬Ø¯Ùد PropertyRequiredErrorØ ÙÙÙÙ Ù
ا عÙÙÙØ§ تÙ
Ø±ÙØ±Ù Ù٠اسÙ
Ø§ÙØ®Ø§ØµÙØ©: new PropertyRequiredError(property)âØ ÙØ³ÙÙÙÙÙØ¯ Ø§ÙØ¨Ø§ÙÙ Ø§ÙØ±Ø³Ø§Ùة٠message Ø§ÙØªÙ ÙÙÙÙ
ÙØ§ ÙØÙ Ø§ÙØ¨Ø´Ø±.
ÙØ§ØØ¸ ÙÙ٠أÙÙÙØ§ Ø£Ø³ÙØ¯Ùا Ø§ÙØ®Ø§ØµÙØ© this.name Ù٠باÙÙ PropertyRequiredError ÙØ¯ÙÙÙØ§Ø Ù
Ø±ÙØ© ثاÙÙØ©. ÙØ¯ ØªØ±Ù ÙØ°Ø§ Ø§ÙØ£Ù
ر
Ù
ÙØªØ¹Ø¨Ùا ØÙØ« Ø³ØªÙØ³Ùد ÙÙÙ
Ø© this.name = <class name>â ÙÙ ÙÙ٠صÙ٠خطأ ØªØµÙØ¹Ù. ÙÙ
Ù٠تجÙÙØ¨ ÙØ°Ø§ Ø§ÙØ¹Ùاء ÙØ¥Ø³Ùاد ÙÙÙ
Ø©
Ù
ÙØ§Ø³Ø¨Ø© ÙØµÙÙ âØ§ÙØ®Ø·Ø£ Ø§ÙØ£Ø³Ø§Ø³â this.name = this.constructor.nameØ ÙØ¨Ø¹Ø¯Ùا ÙØ±Ø« Ù
Ù ÙØ°Ø§ Ø§ÙØµÙÙ ÙÙÙ Ø£ØµÙØ§Ù
Ø§ÙØ£Ø®Ø·Ø§Ø¡ اÙÙ
Ø®ØµÙØµØ©.
ÙÙØ³Ù
ÙÙ Ù
Ø«ÙÙØ§ MyError. Ø¥ÙÙÙ Ø´ÙÙØ±Ø© MyError ÙØºÙØ±ÙØ§ Ù
Ù Ø£ØµÙØ§Ù أخطاء Ù
Ø®ØµÙØµØ©Ø ÙÙÙÙ Ù
Ø¨Ø³ÙØ·Ø©:
class MyError extends Error {
constructor(message) {
super(message);
this.name = this.constructor.name; // ÙÙØ§
}
}
class ValidationError extends MyError { }
class PropertyRequiredError extends ValidationError {
constructor(property) {
super("No property: " + property); // Ø®Ø§ØµÙØ© ØºÙØ± Ù
ÙØ¬Ùدة
this.property = property;
}
}
// Ø§ÙØ§Ø³Ù
صØÙØ
alert( new PropertyRequiredError("field").name ); // PropertyRequiredError
Ø§ÙØ¢Ù صارت Ø´ÙÙØ±Ø§Øª Ø§ÙØ£Ø®Ø·Ø§Ø¡ اÙÙ
Ø®ØµÙØµØ© Ø£ÙØµØ± Ø¨ÙØ«Ùر (Ø®Ø§ØµÙØ© ValidationError) إذ ØØ°ÙÙØ§ Ø§ÙØ³Ø·Ø± "this.name = ...â"
ÙÙ Ø§ÙØ¨Ø§ÙÙ.
تغÙÙÙ Ø§ÙØ§Ø³ØªØ«Ùاءات
ÙØ¯Ù Ø§ÙØ¯Ø§ÙØ© readUser ÙÙ Ø§ÙØ´ÙÙØ±Ø© Ø£Ø¹ÙØ§Ù ÙÙ âÙØ±Ø§Ø¡Ø© Ø¨ÙØ§Ùات اÙÙ
ستخدÙ
âØ ÙÙÙ
ÙÙ Ø£Ù ØªØØ¯Ø« Ù
ختÙÙ Ø§ÙØ£Ø®Ø·Ø§Ø¡ Ø£Ø«ÙØ§Ø¡ تÙÙÙØ° ذÙÙ. ØØ§ÙÙÙØ§
ÙØ±Ù SyntaxError ÙValidationError ÙÙØ·Ø ÙÙÙÙ Ù٠اÙÙ
Ø³ØªÙØ¨Ù Ø§ÙØ¹Ø§Ø¬Ù Ø³ØªØµÙØ± Ø§ÙØ¯Ø§ÙØ© readUser Ø£ÙØ¨Ø± ÙØ£Ùبر ÙÙØ¯
تÙÙÙÙØ¯ ÙÙØ§ Ø£ÙÙØ§Ø¹ أخر٠Ù
Ù Ø§ÙØ£Ø®Ø·Ø§Ø¡.
ÙÙ
ÙÙ ÙØªØ¹Ø§Ù
Ù Ù
ع ÙØ°Ù Ø§ÙØ£Ø®Ø·Ø§Ø¡Ø Ø§ÙØ´ÙÙØ±Ø© Ø§ÙØªÙ تستدع٠readUser! ØØ§ÙÙÙØ§ ÙØ§ تستعÙ
Ù Ø¥ÙØ§ بضعة ØªØ¹Ø§Ø¨ÙØ± Ø´Ø±Ø·ÙØ© if ÙÙ ÙÙØªÙ
catch (ØªÙØØµ Ø§ÙØµÙÙ ÙØªØªØ¹Ø§Ù
Ù Ù
ع Ø§ÙØ£Ø®Ø·Ø§Ø¡ ÙØªÙØ¹ÙØ¯ رÙ
Ù Ù
ا ÙØ§ تÙÙÙ
)Ø
ÙØ³ÙÙÙ٠اÙÙ
خطط ÙÙØ°Ø§:
try {
...
readUser() // Ø§ÙØ®Ø·Ø£ Ø§ÙØ£Ø³Ø§Ø³Ù ÙÙØ§
...
} catch (err) {
if (err instanceof ValidationError) {
// â«Ù
Ø¹Ø§ÙØØ© أخطاء ValidationError
} else if (err instanceof SyntaxError) {
// â«Ù
Ø¹Ø§ÙØ¬Ø© Ø§ÙØ£Ø®Ø·Ø§Ø¡ Ø§ÙØµÙØ§ØºÙØ© SyntaxError
} else {
throw err; // خطأ Ù
جÙÙÙ ÙÙÙÙØ¹Ø¯ رÙ
ÙÙ Ù
Ù Ø¬Ø¯ÙØ¯
}
}
ÙØ±Ù ÙÙ Ø§ÙØ´ÙÙØ±Ø© Ø§ÙØ¨Ø±Ù
Ø¬ÙØ© Ø£Ø¹ÙØ§Ù ÙÙØ¹ÙÙ Ù
Ù Ø§ÙØ£Ø®Ø·Ø§Ø¡ ÙÙÙÙ Ù
Ù
Ù٠أ٠ÙÙÙÙ Ø£ÙØ«Ø± Ù
٠ذÙÙ.
ÙÙÙÙ Ù
ت٠ÙÙÙØ¯Øª Ø§ÙØ¯Ø§ÙØ© readUser Ø£ÙÙØ§Ø¹ أخر٠Ù
Ù Ø§ÙØ£Ø®Ø·Ø§Ø¡Ø ÙØ¹ÙÙÙØ§ Ø·Ø±Ø Ø§ÙØ³Ø¤Ø§Ù: Ù٠عÙÙÙØ§ ØÙÙØ§ ÙØØµ ÙÙÙ ÙÙØ¹ Ù
٠أÙÙØ§Ø¹
Ø§ÙØ£Ø®Ø·Ø§Ø¡ ÙØ§ØØ¯Ùا ÙØ§ØØ¯Ùا ÙÙ ÙÙÙ Ø´ÙÙØ±Ø© تستدع٠readUserØ
عادة٠Ù
ا ÙÙÙÙ Ø§ÙØ¬Ùاب ÙÙ âÙØ§âØ ÙØ§ÙØ´ÙÙØ±Ø© Ø§ÙØ®Ø§Ø±Ø¬ÙØ© ØªÙØ¶Ù٠أ٠تÙÙÙ âØ¹ÙÙ Ù
ستÙÙ٠أعÙÙ Ù
٠ذÙ٠اÙÙ
ستÙÙâØ Ø£Ù Ø£Ù ØªØ³ØªÙÙ
Ù
ا ÙØ´Ø¨Ù
âØ®Ø·Ø£ ÙÙ ÙØ±Ø§Ø¡Ø© Ø§ÙØ¨ÙØ§ÙØ§ØªâØ Ø£Ù
ÙØ§ ع٠سبب ØØ¯Ùث٠ÙÙØ§ Ø¹ÙØ§ÙØ© ÙÙØ§ ب٠(طاÙÙ
ا Ø±Ø³Ø§ÙØ© Ø§ÙØ®Ø·Ø£ تص٠ÙÙØ³Ùا). أ٠ربÙÙ
ا (ÙÙØ°Ø§ Ø£ÙØ¶Ù) تÙÙÙ
ÙÙØ§Ù طرÙÙØ© ÙØªØØµÙ ÙÙÙØ§ عÙÙ Ø¨ÙØ§Ùات Ø§ÙØ®Ø·Ø£Ø Ù٠أرادت Ø§ÙØ´ÙÙØ±Ø© ذÙÙ.
ØªØ¯Ø¹Ù Ø§ÙØ·Ø±ÙÙØ© Ø§ÙØªÙ ÙØµÙÙØ§Ùا بتغÙÙÙ Ø§ÙØ§Ø³ØªØ«Ùاءات.
- ÙÙØµÙع Ø§ÙØ¢Ù صÙÙ âØ®Ø·Ø£ Ù٠اÙÙØ±Ø§Ø¡Ø©â
ReadErrorÙÙÙ Ø«ÙÙ ÙØ°Ù Ø§ÙØ£Ø®Ø·Ø§Ø¡. - Ù
ØªÙ ØØ¯Ø«Øª أخطاء Ø¯Ø§Ø®Ù Ø§ÙØ¯Ø§ÙØ©
readUserØ Ø³ÙÙØªÙØ·ÙØ§ ÙÙÙØ§ ÙÙÙÙÙÙØ¯ خطأReadErrorØ Ø¨Ø¯ÙÙØ§ Ù ÙValidationErrorÙSyntaxError. - اÙÙØ§Ø¦Ù
ReadErrorسÙÙØ¨ÙÙ Ø£ÙØ¶Ùا إشارة Ø¥ÙÙ Ø§ÙØ®Ø·Ø£ Ø§ÙØ£ØµÙÙ ÙÙ Ø®Ø§ØµÙØ© Ø§ÙØ³Ø¨Ø¨cause. ÙØ°Ø§ Ù ÙÙØ°Ø§ ÙÙ ÙÙÙÙ ÙÙØ´ÙÙØ±Ø© Ø§ÙØ®Ø§Ø±Ø¬ÙØ© (Ø§ÙØªÙ ستستدعÙreadUser) Ø¥ÙÙØ§ ÙØØµReadError. ÙÙÙØ³ ÙÙÙ ÙÙØ¹ ٠٠أخطاء ÙØ±Ø§Ø¡Ø© Ø§ÙØ¨ÙØ§ÙØ§Øª. ÙØ¥Ù ÙØ§Ù ÙØØªØ§Ø¬ ÙÙ Ø²ÙØ¯ Ù Ù Ø§ÙØªÙاصÙÙ Ø¹Ù Ø§ÙØ®Ø·Ø£ ÙÙ ÙÙÙ Ø§ÙØ¹Ùدة Ø¥ÙÙ Ø§ÙØ®Ø§ØµÙØ©causeÙØ§ÙتØÙÙ Ù ÙÙØ§. Ø¥ÙÙÙ Ø§ÙØ´ÙÙØ±Ø© Ø§ÙØªÙ ÙÙØ¹Ø±ÙÙ ÙÙÙØ§ Ø§ÙØ®Ø·Ø£ReadErrorÙÙÙ Ø«Ù٠طرÙÙØ© استع٠اÙÙ ÙÙ Ø§ÙØ¯Ø§ÙØ©readUserÙÙÙtry..catch:
class ReadError extends Error {
constructor(message, cause) {
super(message);
this.cause = cause;
this.name = 'ReadError'; // خطأ Ù٠اÙÙØ±Ø§Ø¡Ø©
}
}
class ValidationError extends Error { /*...*/ }
class PropertyRequiredError extends ValidationError { /* ... */ }
function validateUser(user) {
if (!user.age) {
throw new PropertyRequiredError("age"); // Ø§ÙØ¹Ù
ر
}
if (!user.name) {
throw new PropertyRequiredError("name"); // Ø§ÙØ§Ø³Ù
}
}
function readUser(json) {
let user;
try {
user = JSON.parse(json);
} catch (err) {
// ÙÙØ§
if (err instanceof SyntaxError) {
throw new ReadError("Syntax Error", err); // خطأ ØµÙØ§ØºÙ
} else {
throw err;
}
}
try {
validateUser(user);
} catch (err) {
// ÙÙÙØ§
if (err instanceof ValidationError) {
throw new ReadError("Validation Error", err); // خطأ ÙÙ Ø§ÙØªØÙÙÙ
} else {
throw err;
}
}
}
try {
readUser('{bad json}');
} catch (e) {
if (e instanceof ReadError) {
// ÙÙØ§ alert(e);
// Original error: SyntaxError: Unexpected token b in JSON at position 1
alert("Original error: " + e.cause); // Ø§ÙØ®Ø·Ø£ Ø§ÙØ£ØµÙ
} else {
throw e;
}
}
ÙÙ Ø§ÙØ´ÙÙØ±Ø© Ø£Ø¹ÙØ§Ù تعÙ
Ù Ø§ÙØ¯Ø§ÙØ© readUser تÙ
اÙ
ÙØ§ ÙÙ
ÙØµÙÙØ§Ø ØªÙØªÙØ· أخطاء Ø§ÙØµÙاغة ÙØ§ÙتØÙÙÙ ÙØªØ±Ù
٠أخطاء ÙØ±Ø§Ø¡Ø©
ReadError بدÙÙØ§ (ÙÙ
ا ÙØªÙØ¹ÙØ¯ رÙ
Ù Ø§ÙØ£Ø®Ø·Ø§Ø¡ اÙÙ
جÙÙÙØ© Ø£ÙØ¶Ùا).
ÙÙØ°Ø§ ÙÙØ³ عÙÙ Ø§ÙØ´ÙÙØ±Ø© Ø§ÙØ®Ø§Ø±Ø¬ÙØ© Ø¥ÙÙØ§ ÙØØµ instanceof ReadError ÙÙØ·Ø ÙØ§ داع٠ÙÙØªØÙÙÙ Ù
Ù ÙÙ٠خطأ ÙÙ
ÙÙ Ø£Ù ÙØØµÙ ÙÙ
ÙØ°Ù اÙÙ
Ø¬Ø±ÙØ©.
ÙÙØ³Ù
ÙÙ ÙØ°Ø§ اÙÙÙØ¬ âØ¨ØªØºÙÙÙ Ø§ÙØ§Ø³ØªØ«ÙØ§Ø¡Ø§Øªâ ØÙØ« ÙØ³ØªÙÙ
ÙØÙ âØ§ÙØ§Ø³ØªØ«Ùاءات Ù٠اÙÙ
ستÙ٠اÙÙ
ÙØ®Ùض Ù
Ù Ø§ÙØ¨Ø±Ù
جةâ (low level) ÙâÙÙØºÙÙÙÙØ§â
داخ٠خطأ ReadError ÙÙÙÙ Ø£ÙØ«Ø± بساطة ÙØ£Ø³Ù٠استعÙ
اÙÙØ§ ÙÙØ´ÙÙØ±Ø§Øª Ø§ÙØªÙ ØªÙØ§Ø¯Ù عÙÙ Ø§ÙØ¯ÙاÙ. ÙØ°Ø§ اÙÙÙØ¬ Ù
ستعÙ
Ù Ø¨ÙØ«Ø±Ø© ÙÙ
Ø§ÙØ¨Ø±Ù
جة ÙØ§Ø¦ÙÙØ© Ø§ÙØªÙجÙÙ.
Ø®ÙØ§ØµØ©
- ÙÙ
ÙÙÙØ§ ÙØ±Ø§Ø«Ø© صÙÙ Ø§ÙØ®Ø·Ø£
ErrorÙØºÙØ±ÙØ§ ٠٠أخطاء ٠ض٠ÙÙØ© Ù٠ا اÙÙØ±Ø§Ø«Ø© Ø§ÙØ¹Ø§Ø¯ÙØ©. اÙÙ Ù٠أ٠ÙÙØªØ¨Ù Ù Ù Ø®Ø§ØµÙØ© Ø§ÙØ§Ø³ÙnameÙÙØ§ ÙÙØ³Ù استدعاءsuper. - ÙÙ
ÙÙÙØ§ استعÙ
اÙ
instanceofÙÙØØµ ٠ا ÙØ±Ùد ٠٠أخطاء بدÙÙØ©Ø Ù٠ا ÙÙØ¹Ù ٠اÙÙ ÙØ¹Ø§Ù ٠٠ع اÙÙØ±Ø§Ø«Ø©. Ø£ØÙاÙÙØ§ ÙØ³ØªÙÙ ÙØ§Ø¦Ù خطأ Ù Ù Ù ÙØªØ¨Ø© Ø·Ø±Ù Ø«Ø§ÙØ« Ù٠ا ٠٠طرÙÙØ© سÙÙØ© ÙÙØ¹Ø±Ù اس٠صÙÙÙØ§. ÙÙØ§ ÙÙ ÙÙ Ø§Ø³ØªØ¹Ù Ø§Ù Ø®Ø§ØµÙØ© Ø§ÙØ§Ø³ÙnameÙØ¥Ø¬Ø±Ø§Ø¡ ÙØ°Ø§ اÙÙØØµ. - أسÙÙØ¨ تغÙÙÙ Ø§ÙØ§Ø³ØªØ«Ùاءات Ù٠أسÙÙØ¨ Ù
ÙØªØ´Ø± Ø§ÙØ§Ø³ØªØ¹Ù
Ø§ÙØ ÙÙ٠تتعاÙ
Ù Ø§ÙØ¯Ø§ÙØ© Ù
ع Ø§ÙØ§Ø³ØªØ«Ùاءات Ù٠اÙÙ
ستÙ٠اÙÙ
ÙØ®Ùض Ù
Ù Ø§ÙØ¨Ø±Ù
جةØ
ÙØªØµÙع أخطاء Ù
Ø³ØªÙØ§Ùا عاÙ٠بد٠تÙ٠اÙÙ
ÙØ®Ùضة. ÙØ£ØÙاÙÙØ§ ØªØµÙØ± Ø§ÙØ§Ø³ØªØ«Ùاءات اÙÙ
ÙØ®Ùضة خصائص ÙÙØ§Ø¦Ù Ø§ÙØ®Ø·Ø£ (تÙ
اÙ
ÙØ§ Ù
Ø«Ù
err.causeÙÙ Ø§ÙØ£Ù Ø«ÙØ© Ø£Ø¹ÙØ§Ù)Ø ÙÙÙÙÙ ÙØ°Ø§ ÙÙØ³ Ø¥ÙØ²Ø§Ù ÙÙØ§ Ø£Ø¨Ø¯ÙØ§.
ت٠ارÙÙ
اÙÙØ±Ø§Ø«Ø© Ù Ù SyntaxError
Ø§ÙØ£ÙÙ
ÙØ©: 5
Ø§ØµÙØ¹ Ø§ÙØµÙÙ FormatError ÙÙØ±Ø« Ù
Ù Ø§ÙØµÙ٠اÙÙ
ضÙ
ÙÙ SyntaxError.
ÙØ¬Ø¨ Ø£Ù ÙØ¯Ø¹Ù
Ø§ÙØµÙ٠خصائص Ø§ÙØ§Ø³Ù
name ÙØ§ÙØ±Ø³Ø§ÙØ© message ÙØ§ÙÙ
ÙÙØ¯Ø³ stack.
طرÙÙØ© Ø§ÙØ§Ø³ØªØ¹Ù
اÙ:
let err = new FormatError("formatting error"); // خطأ ÙÙ Ø§ÙØªÙسÙÙ
alert( err.message ); // خطأ ÙÙ Ø§ÙØªÙسÙÙ
alert( err.name ); // FormatError
alert( err.stack ); // اÙÙ
ÙÙØ¯Ø³
alert( err instanceof FormatError ); // true
alert( err instanceof SyntaxError ); // â«true (إذ ÙØ±Ø« Ø§ÙØµÙÙ Ø§ÙØµÙÙÙ SyntaxError)
Ø§ÙØÙ
class FormatError extends SyntaxError {
constructor(message) {
super(message);
this.name = this.constructor.name;
}
}
let err = new FormatError("formatting error");
alert( err.message ); // خطأ ÙÙ Ø§ÙØªÙسÙÙ
alert( err.name ); // خطأ ÙÙ Ø§ÙØªÙسÙÙ
alert( err.stack ); // stack(اÙÙ
ÙÙØ¯Ø³)
alert( err instanceof SyntaxError ); // true
ترج٠ة -ÙØ¨ØªØµØ±Ù- ÙÙÙØµÙ [Custom errors, extending Error](https://javascript.info/custom- errors) Ù Ù ÙØªØ§Ø¨ The JavaScript language
Ø§ÙØªØ¹ÙÙÙØ§Øª
<code>Ø ÙÙÙÙØ«Ùر Ù Ù Ø§ÙØ³Ø·Ùر استخدÙ<pre>Ø ÙÙØ£Ùثر Ù Ù 10 Ø³Ø·ÙØ± استخد٠(plnkr, JSBin, codepenâ¦)