زÙ
اÙÛ Ú©Ù Ù
ا ÚÛØ²Û را ØªÙØ³Ø¹Ù Ù
ÛâØ¯ÙÛÙ
Ø Ø§ØºÙØ¨ اÙÙØ§Øª Ø¨Ù Ú©ÙØ§Ø³âÙØ§Û Ø§Ø±ÙØ± Ø®ÙØ¯Ù
Ø§Ù Ø¨Ø±Ø§Û Ø¨Ø§Ø²ØªØ§Ø¨ Ø¯Ø§Ø¯Ù Ø§Ø´ØªØ¨Ø§ÙØ§Øª Ø®Ø§ØµÛ Ú©Ù Ù
Ù
ک٠است در Ú©Ø§Ø±ÙØ§ÛÙ
ا٠رخ دÙÙØ¯ ÙÛØ§Ø² دارÛÙ
. Ø¨Ø±Ø§Û Ø§Ø±ÙØ±ÙØ§Û Ø¯Ø±Ù٠عÙ
ÙÛØ§Øª شبکÙâØ§Û Ù
Ù
ک٠است ب٠HttpError ÙÛØ§Ø² داشت٠باشÛÙ
Ø Ø¨Ø±Ø§Û Ø¹Ù
ÙÛØ§Øª پاÛگا٠داد٠ب٠DbErrorØ Ø¨Ø±Ø§Û Ø¹Ù
ÙÛØ§Øª جستج٠ب٠NotFoundError Ù ØºÛØ±Ù.
Ø§Ø±ÙØ±ÙØ§Û Ù
ا Ø¨Ø§ÛØ¯ از ÙÛÚÚ¯ÛâÙØ§Û اÙÙÛÙ Ø§Ø±ÙØ± Ù
اÙÙØ¯ messageØ name Ù ØªØ±Ø¬ÛØØ§ stack ÙÙ
Ù¾Ø´ØªÛØ¨Ø§ÙÛ Ú©ÙÙØ¯. اÙ
ا Ø¢ÙâÙØ§ Ù
Ù
ک٠است ÙÛÚÚ¯ÛâÙØ§Û Ø®ÙØ¯ را Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´ÙØ¯Ø Ø¨Ø±Ø§Û Ù
Ø«Ø§Ù Ø´ÛØ¡ÙØ§Û HttpError Ù
Ù
ک٠است ÙÛÚÚ¯Û statusCode را با Ù
ÙØ¯Ø§Ø±Û Ù
اÙÙØ¯ 404 ÛØ§ 403 ÛØ§ 500 Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´ÙØ¯.
Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت اجاز٠Ù
ÛâØ¯ÙØ¯ ک٠از throw ÙÙ
را٠با ÙØ± آرگÙÙ
اÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
Ø Ù¾Ø³ از ÙØØ§Ø¸ ÙÙÛ Ø§Ø±ÙØ±ÙØ§Û Ø´Ø®ØµÛâØ³Ø§Ø²Û Ø´Ø¯Ù Ù
ا ÙÛØ§Ø²Û ÙØ¯Ø§Ø±Ùد ک٠از Error Ø§Ø±Ø«âØ¨Ø±Û Ú©ÙÙØ¯. اÙ
ا اگر Ù
ا از Ø¢Ù Ø§Ø±Ø«âØ¨Ø±Û Ú©ÙÛÙ
Ø Ø³Ù¾Ø³ Ø§Ø³ØªÙØ§Ø¯Ù از obj instanceof Error Ø¨Ø±Ø§Û Ø´ÙØ§Ø³Ø§ÛÛ Ø´ÛØ¡ÙØ§Û Ø§Ø±ÙØ± Ù
Ù
Ú©Ù Ù
ÛâØ´ÙØ¯. پس Ø¨ÙØªØ± است از Ø¢Ù Ø§Ø±Ø«âØ¨Ø±Û Ú©ÙÛÙ
.
ÙÙ
Ø§ÙØ·Ùر Ú©Ù Ø¨Ø±ÙØ§Ù
٠رشد Ù
ÛâÚ©ÙØ¯Ø Ø·Ø¨ÛØ¹ØªØ§ Ø§Ø±ÙØ±ÙØ§Û Ù
ا ÛÚ© Ø³ÙØ³Ù Ù
راتب تشکÛÙ Ù
ÛâØ¯ÙÙØ¯. Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ HttpTimeoutError Ù
Ù
ک٠است از HttpError Ø§Ø±Ø«âØ¨Ø±Û Ú©ÙØ¯ Ù ÙÙ
ÛÙØ·Ùر اداÙ
٠داشت٠باشد.
تع٠Û٠داد٠Error
ب٠عÙÙØ§Ù ÛÚ© Ù
Ø«Ø§ÙØ Ø¨ÛØ§ÛÛØ¯ تابع readUser(json) را در ÙØ¸Ø± Ø¨Ú¯ÛØ±ÛÙ
ک٠جÛâØ³Ø§Ù ØØ§ÙÛ Ø¯Ø§Ø¯Ù Ú©Ø§Ø±Ø¨Ø± را Ù
ÛâØ®ÙØ§Ùد.
اÛÙØ¬Ø§ Ù
ثاÙÛ Ø§Ø² اÛÙÚ©Ù ÛÚ© json Ù
عتبر ÚÚ¯ÙÙ٠است دارÛÙ
:
let json = `{ "name": "John", "age": 30 }`;
از درÙÙØ Ù
ا از JSON.parse Ø§Ø³ØªÙØ§Ø¯Ù Ø®ÙØ§ÙÛÙ
کرد. اگر اÛÙ Ù
تد ÛÚ© json ÙØ§Ùص را Ø¯Ø±ÛØ§Ùت Ú©ÙØ¯Ø سپس SyntaxError پرتاب Ù
ÛâÚ©ÙØ¯. اÙ
ا اگر json از ÙØØ§Ø¸ سÛÙØªÚ©Ø³ درست باشد ب٠Ù
عÙÛ ÛÚ© کاربر Ù
عتبر ÙÛØ³Øª ÙÙØ Ù
Ù
ک٠است ک٠داد٠Ù
ÙÙ
را ÙØ¯Ø§Ø´ØªÙ باشد. Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ Ù
Ù
ک٠است ÙÛÚÚ¯ÛâÙØ§Û name Ù age Ú©Ù Ø¨Ø±Ø§Û Ú©Ø§Ø±Ø¨Ø±Ø§Ù Ù
ا Ø¶Ø±ÙØ±Û است را ÙØ¯Ø§Ø´ØªÙ باشد.
تابع readUser(json) Ù٠تÙÙØ§ جÛâØ³Ø§Ù Ø±Ø§ Ù
ÛâØ®ÙØ§Ùد بÙک٠داد٠را Ø¨Ø±Ø±Ø³Û (Â«Ø§Ø¹ØªØ¨Ø§Ø±Ø³ÙØ¬Û») Ù
ÛâÚ©ÙØ¯. اگر ÙÛÙØ¯ÙØ§Û Ù
ÙØ±Ø¯ ÙÛØ§Ø² ÙØ¬Ùد ÙØ¯Ø§Ø´ØªÙ Ø¨Ø§Ø´ÙØ¯ ÛØ§ Ø´Ú©Ù Ø§Ø´ØªØ¨Ø§Ù Ø¨Ø§Ø´Ø¯Ø Ù¾Ø³ ÛÚ© Ø§Ø±ÙØ± دارÛÙ
. ٠اÛÙ ÛÚ© SyntaxError ÙÛØ³Øª ÚÙ٠داد٠از ÙØØ§Ø¸ سÛÙØªÚ©Ø³ درست است بÙÚ©Ù ÙÙØ¹ دÛÚ¯Ø±Û Ø§Ø² Ø§Ø±ÙØ± است. Ù
ا ب٠آ٠ValidationError (Ø§Ø±ÙØ± Ø§Ø¹ØªØ¨Ø§Ø±Ø³ÙØ¬Û) Ù
ÛâÚ¯ÙÛÛÙ
Ù Ø¨Ø±Ø§Û Ø¢Ù ÛÚ© Ú©ÙØ§Ø³ Ù
ÛâØ³Ø§Ø²ÛÙ
. ÛÚ© Ø§Ø±ÙØ± از اÛÙ ÙÙØ¹ Ø¨Ø§ÛØ¯ Ø§Ø·ÙØ§Ø¹Ø§ØªÛ دربار٠ÙÛÙØ¯ Ù
تخÙ٠را داشت٠باشد.
Ú©ÙØ§Ø³ ValidationError Ù
ا Ø¨Ø§ÛØ¯ از Ú©ÙØ§Ø³ Error Ø§Ø±Ø«âØ¨Ø±Û Ú©ÙØ¯.
Ú©ÙØ§Ø³ Error درÙÙâØ³Ø§Ø®Øª است اÙ
ا اÛÙØ¬Ø§ کد ØªÙØ±ÛØ¨Û Ø¢Ù Ø±Ø§ دارÛÙ
تا Ø¨ØªÙØ§ÙÛÙ
Ù
ØªÙØ¬Ù Ø´ÙÛÙ
Ú©Ù ÚÙ ÚÛØ²Û را تعÙ
ÛÙ
Ù
ÛâØ¯ÙÛÙ
:
// درÙÙâØ³Ø§Ø®Øª Ú©Ù ØªÙØ³Ø· Ø®ÙØ¯ Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت تعرÛ٠شد٠است 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); // Whoops!
alert(err.name); // ValidationError
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("Ø¯Ø§Ø¯Ù ÙØ§Ù
عتبر: " + err.message); // Invalid data: No field: name
} else if (err instanceof SyntaxError) { // (*)
alert("Ø§Ø±ÙØ± سÛÙØªÚ©Ø³ جÛâØ³Ø§Ù: " + err.message);
} else {
throw err; // Ú©Ù rethrow Ø§Ø±ÙØ± ÙØ§Ø´ÙØ§Ø³Ø Ø¢Ù Ø±Ø§ (**)
}
}
بÙÙÚ© try..catch در کد Ø¨Ø§ÙØ§ ÙÙ
ValidationError Ù
ا Ù ÙÙ
SyntaxError درÙÙâØ³Ø§Ø®Øª را از JSON.parse Ù
Ø¯ÛØ±Ûت Ù
ÛâÚ©ÙØ¯.
ÙØ·Ùا ب٠اÛÙÚ©Ù Ù
ا ÚÚ¯ÙÙ٠از instanceof Ø¨Ø±Ø§Û ÚÚ© کرد٠ÛÚ© ÙÙØ¹ Ø§Ø±ÙØ± خاص در خط (*) Ø§Ø³ØªÙØ§Ø¯Ù کردÛÙ
ØªÙØ¬Ù Ú©ÙÛØ¯.
ÙÙ
ÚÙÛÙ Ù
ÛâØªÙØ§ÙستÛÙ
err.name را Ø¨Ø±Ø±Ø³Û Ú©ÙÛÙ
Ø Ù
Ø«ÙØ§ اÛÙÚ¯ÙÙÙ:
// ...
// (err instanceof SyntaxError) ب٠جاÛ
} else if (err.name == "SyntaxError") { // (*)
// ...
ÙØ³Ø®Ù instanceof Ø®ÛÙÛ Ø¨ÙØªØ± است ÚÙ٠در Ø¢ÛÙØ¯Ù Ù
ا ÙØ±Ø§Ø± است ValidationError را تعÙ
ÛÙ
دÙÛÙ
Ø Ø§Ø² آ٠اÙÙØ§Ø¹ دÛگر بسازÛÙ
Ø Ù
Ø«ÙØ§ PropertyRequiredError. Ù Ø¨Ø±Ø±Ø³Û instanceof Ø¨Ø±Ø§Û Ú©ÙØ§Ø³âÙØ§Û Ø§Ø±Ø«âØ¨Ø± Ø¬Ø¯ÛØ¯ ÙÙ
کار Ø®ÙØ§Ùد کرد. پس اÛÙ Ø±ÙØ´ Ø¨Ø¹ÛØ¯ است Ú©Ù Ù
ÙØ³ÙØ® Ø´ÙØ¯.
ÙÙ
ÚÙÛÙ Ù
ÙÙ
است ک٠اگر catch ÛÚ© Ø§Ø±ÙØ± ÙØ§Ø´Ùاس را Ù
ÙØ§Ùات Ú©ÙØ¯Ø در خط (**) آ٠را rethrow Ú©ÙØ¯. بÙÙÚ© 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); // Invalid data: No property: name
alert(err.name); // PropertyRequiredError
alert(err.property); // name
} else if (err instanceof SyntaxError) {
alert("JSON Syntax Error: " + err.message);
} else {
throw err; // Ú©Ù rethrow Ø§Ø±ÙØ± ÙØ§Ø´ÙØ§Ø®ØªÙØ آ٠را
}
}
Ø§Ø³ØªÙØ§Ø¯Ù از Ú©ÙØ§Ø³ Ø¬Ø¯ÛØ¯ PropertyRequiredError آسا٠است: Ù
ا ÙÙØ· Ø¨Ø§ÛØ¯ اسÙ
ÙÛÚÚ¯Û Ø±Ø§ پاس دÙÛÙ
: new PropertyRequiredError(property). Ù¾ÛØ§Ù
message Ú©Ù Ø¨Ø±Ø§Û Ø§ÙØ³Ø§Ù Ø®ÙØ§Ùا است ØªÙØ³Ø· تابع Ø³Ø§Ø²ÙØ¯Ù تÙÙÛØ¯ Ù
ÛâØ´ÙØ¯.
ÙØ·Ùا ØªÙØ¬Ù Ú©ÙÛØ¯ ک٠در تابع Ø³Ø§Ø²ÙØ¯Ù PropertyRequiredError Ù
ÙØ¯Ø§Ø± this.name Ø¯ÙØ¨Ø§Ø±Ù Ø¨Ù ØµÙØ±Øª Ø¯Ø³ØªÛ Ù
شخص Ù
ÛâØ´ÙØ¯. اÛÙ Ù
ÙØ¶Ùع Ù
Ù
ک٠است Ú©Ù
Û Ø®Ø³ØªÙâÚ©ÙÙØ¯Ù باشد â Ù
شخص کرد٠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;
}
}
// درست است name
alert( new PropertyRequiredError("field").name ); // PropertyRequiredError
ØØ§Ùا Ø§Ø±ÙØ±ÙØ§Û Ø´Ø®ØµÛâØ³Ø§Ø²Û Ø´Ø¯Ù Ø¨Ø³ÛØ§Ø± Ú©ÙØªØ§ÙâØªØ± ÙØ³ØªÙد Ù
Ø®ØµÙØµØ§ ValidationErrorØ ÚÙÙ Ù
ا از خط "this.name = ..." در تابع Ø³Ø§Ø²ÙØ¯Ù Ø®ÙØ§ØµÛ ÛØ§ÙتÛÙ
.
Ø¯Ø±Ø¨Ø±Ú¯Ø±ÙØªÙ Ø§Ø³ØªØ«ÙØ§Ø¡Ùا
ÙØ¯Ù تابع readUser در کد Ø¨Ø§ÙØ§ Â«Ø®ÙØ§Ùد٠داد٠کاربر» است. Ù
Ù
ک٠است در ØÛ٠اÛÙ ÙØ±Ø§ÛÙØ¯ اÙÙØ§Ø¹ Ù
ختÙÙÛ Ø§Ø² Ø§Ø±ÙØ± رخ Ø¯ÙØ¯. ÙÙ
اکÙÙÙ Ù
ا SyntaxError Ù ValidationError را دارÛÙ
اÙ
ا در Ø¢ÛÙØ¯Ù تابع readUser Ù
Ù
ک٠است رشد Ú©ÙØ¯ Ù Ø§ØØªÙ
Ø§ÙØ§ اÙÙØ§Ø¹ دÛÚ¯Ø±Û Ø§Ø² Ø§Ø±ÙØ±Ùا را Ø§ÛØ¬Ø§Ø¯ Ú©ÙØ¯.
Ú©Ø¯Û Ú©Ù readUser را ÙØ±Ø§ Ù
ÛâØ®ÙØ§Ùد Ø¨Ø§ÛØ¯ اÛÙ Ø§Ø±ÙØ±Ùا را Ù
Ø¯ÛØ±Ûت Ú©ÙØ¯. ÙÙ
اکÙÙÙØ اÛ٠کد در بÙÙÚ© catch از ÚÙØ¯ if Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâÚ©ÙØ¯ Ú©Ù Ú©ÙØ§Ø³ را Ø¨Ø±Ø±Ø³Û Ù Ø§Ø±ÙØ±ÙØ§Û Ø´ÙØ§Ø®ØªÙ شد٠را Ù
Ø¯ÛØ±Ûت Ù
ÛâÚ©ÙØ¯ Ù Ø§Ø±ÙØ±ÙØ§Û ÙØ§Ø´Ùاخت٠را rethrow Ù
ÛâÚ©ÙØ¯.
رÙÛ٠اÛÙÚ¯ÙÙ٠است:
try {
...
readUser() // Ù
ÙØ¨Ø¹ Ø§ØØªÙ
اÙÛ Ø§Ø±ÙØ±
...
} catch (err) {
if (err instanceof ValidationError) {
// Ù
Ø¯ÛØ±Ûت Ø§Ø±ÙØ±ÙØ§Û Ø§Ø¹ØªØ¨Ø§Ø±Ø³ÙØ¬Û
} else if (err instanceof SyntaxError) {
// Ù
Ø¯ÛØ±Ûت Ø§Ø±ÙØ±ÙØ§Û Ø³ÛÙØªÚ©Ø³
} else {
throw err; // Ù
ÛâÚ©ÙÛÙ
rethrow Ø§Ø±ÙØ± ÙØ§Ø´ÙØ§Ø®ØªÙØ آ٠را
}
}
در کد Ø¨Ø§ÙØ§ Ù ÛâØªÙØ§ÙÛ٠د٠ÙÙØ¹ از Ø§Ø±ÙØ± را ببÛÙÛ٠ا٠ا Ø¨ÛØ´ØªØ± از Ø¢Ù ÙÙ Ù ÛâØªÙØ§Ùد ÙØ¬Ùد داشت٠باشد.
اگر تابع readUser ÚÙØ¯ ÙÙØ¹ Ø§Ø±ÙØ± تÙÙÛØ¯ Ú©ÙØ¯Ø سپس Ù
ا Ø¨Ø§ÛØ¯ از Ø®ÙØ¯Ù
ا٠بپرسÛÙ
: Ø¢ÛØ§ ÙØ§Ùعا Ù
ÛâØ®ÙØ§ÙÛÙ
ÙØ± بار Ø¨Ø±Ø§Û ØªÚ© تک Ø§Ø±ÙØ±Ùا Ø¨Ø±Ø±Ø³Û Ø§ÙØ¬Ø§Ù
دÙÛÙ
Ø
Ø§ØºÙØ¨ اÙÙØ§Øª Ø¬ÙØ§Ø¨ Â«Ø®ÛØ±Â» است: ٠ا Ù ÛâØ®ÙØ§ÙÛ٠«ÛÚ© Ù¾ÙÙ Ø¨Ø§ÙØ§ØªØ± از ت٠ا٠آÙâÙØ§Â» باشÛÙ . ٠ا ÙÙØ· Ù ÛâØ®ÙØ§ÙÛ٠بداÙÛÙ Ø¢ÛØ§ ÛÚ© Â«Ø§Ø±ÙØ± Ø®ÙØ§Ùد٠دادÙ» ÙØ¬Ùد داشت ÛØ§ Ø®ÛØ± â Ø§ÛÙک٠دÙÛÙØ§ ÚØ±Ø§ Ø§ØªÙØ§Ù Ø§ÙØªØ§Ø¯ Ø§ØºÙØ¨ اÙÙØ§Øª ÙØ§Ù Ø±Ø¨ÙØ· است (Ù¾ÛØ§Ù Ø§Ø±ÙØ± اÛÙ Ù ÙØ¶Ùع را ØªÙØ¶ÛØ Ù ÛâØ¯ÙØ¯). ÛØ§Ø ØØªÛ Ø¨ÙØªØ±Ø Ù ÛâØ®ÙØ§ÙÛ٠راÙÛ Ø¨Ø±Ø§Û Ø¯Ø±ÛØ§Ùت Ø¬Ø²Ø¦ÛØ§Øª Ø§Ø±ÙØ± داشت٠باشÛ٠ا٠ا ÙÙØ· در ØµÙØ±ØªÛ Ú©Ù ÙÛØ§Ø² ٠ا باشد.
تکÙÛÚ©Û Ú©Ù Ù Ø§ اÛÙØ¬Ø§ Ø´Ø±Ø Ù ÛâØ¯ÙÛÙ Â«Ø¯Ø±Ø¨Ø±Ú¯Ø±ÙØªÙ Ø§Ø³ØªØ«ÙØ§Ø¡Ùا (wrapping exceptions)» ÙØ§Ù برد٠٠ÛâØ´ÙØ¯.
- Ù
ا Ú©ÙØ§Ø³ Ø¬Ø¯ÛØ¯Û Ø¨Ù ÙØ§Ù
ReadErrorØ¨Ø±Ø§Û ÙÙ Ø§ÛØ´ ÛÚ© Ø§Ø±ÙØ± Â«Ø®ÙØ§Ùد٠دادÙ» عا٠٠ÛâØ³Ø§Ø²ÛÙ . - تابع
readUserØ§Ø±ÙØ±ÙØ§Û Ø®ÙØ§Ùد٠داد٠ک٠درÙÙ Ø¢Ù Ø§ØªÙØ§Ù Ù ÛâØ§ÙØªÙد را Ù ÛâÚ¯ÛØ±Ø¯Ø ٠اÙÙØ¯ValidationErrorÙSyntaxErrorØ Ù Ø¨Ù Ø¬Ø§Û Ø¢ÙâÙØ§ ÛÚ©ReadErrorتÙÙÛØ¯ Ù ÛâÚ©ÙØ¯. - Ø´ÛØ¡
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);
// SyntaxError: Unexpected token b in JSON at position 1 :Ø§Ø±ÙØ± اصÙÛ
alert("Original error: " + e.cause);
} else {
throw e;
}
}
در کد Ø¨Ø§ÙØ§Ø readUser دÙÛÙØ§ ÙÙ
Ø§ÙØ·Ùر Ú©Ù ØªÙØ¶ÛØ Ø¯Ø§Ø¯Ù Ø´Ø¯ کار Ù
ÛâÚ©ÙØ¯ â Ø§Ø±ÙØ±ÙØ§Û سÛÙØªÚ©Ø³ Ù Ø§Ø¹ØªØ¨Ø§Ø±Ø³ÙØ¬Û را Ù
ÛâÚ¯ÛØ±Ø¯ Ù Ø¨Ù Ø¬Ø§Û Ø¢ÙâÙØ§Ø Ø§Ø±ÙØ±ÙØ§Û ReadError را پرتاب Ù
ÛâÚ©ÙØ¯ (Ø§Ø±ÙØ±ÙØ§Û ÙØ§Ø´Ùاخت٠طب٠Ù
عÙ
ÙÙ Ø¯ÙØ¨Ø§Ø±Ù پرتاب Ù
ÛâØ´ÙÙØ¯).
پس کد Ø¨ÛØ±ÙÙÛ instanceof ReadError را Ø¨Ø±Ø±Ø³Û Ù
ÛâÚ©ÙØ¯ ٠تÙ
اÙ
. ÙÛØ§Ø²Û ب٠ÙÛØ³Øª کرد٠تÙ
اÙ
اÙÙØ§Ø¹ Ø§Ø±ÙØ± Ø§ØØªÙ
اÙÛ ÙÛØ³Øª.
اÛÙ Ø±ÙØ´ Â«Ø¯Ø±Ø¨Ø±Ú¯Ø±ÙØªÙ Ø§Ø³ØªØ«ÙØ§Ø¡Ùا» ÙØ§Ù
ÛØ¯Ù Ù
ÛâØ´ÙØ¯ ÚÙÙ Ù
ا Ø§Ø³ØªØ«ÙØ§Ø¡ÙØ§Û Â«Ø³Ø·Ø Ù¾Ø§ÛÛÙ» را Ø¯Ø±ÛØ§Ùت Ù
ÛâÚ©ÙÛÙ
٠آÙâÙØ§ را درÙÙ ReadError Ú©Ù Ø®ÙØ§ØµÙâØªØ± است «دربرÙ
ÛâÚ¯ÛØ±ÛÙ
».
Ø®ÙØ§ØµÙ
- Ø¨Ù Ø·ÙØ± Ø·Ø¨ÛØ¹Û Ù
ا Ù
ÛâØªÙØ§ÙÛÙ
از
ErrorÙ Ø³Ø§ÛØ± Ú©ÙØ§Ø³âÙØ§Û Ø§Ø±ÙØ± درÙÙâØ³Ø§Ø®Øª Ø§Ø±Ø«âØ¨Ø±Û Ú©ÙÛÙ . ÙÙØ· Ø¨Ø§ÛØ¯ ØÙاس٠ا٠ب٠ÙÛÚÚ¯Ûnameباشد Ù ÙØ±Ø§Ø®ÙاÙÛsuperرا ÙØ±Ø§Ù ÙØ´ ÙÚ©ÙÛÙ . - Ù
ÛâØªÙØ§ÙÛÙ
از
instanceofØ¨Ø±Ø§Û Ø¨Ø±Ø±Ø³Û ÙØ¬Ùد Ø¯Ø§Ø´ØªÙ Ø§Ø±ÙØ±ÙØ§Û Ø¨Ù Ø®ØµÙØµ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ . اÛÙ Ù٠را٠با Ø§Ø±Ø«âØ¨Ø±Û ÙÛØ² کار Ù ÛâÚ©ÙØ¯. ا٠ا گاÙÛ Ø§ÙÙØ§Øª ٠ا ÛÚ© Ø´ÛØ¡ Ø§Ø±ÙØ± دارÛ٠ک٠از ÛÚ© کتابخاÙ٠شخص Ø«Ø§ÙØ« Ù ÛâØ¢ÛØ¯ ٠را٠آساÙÛ Ø¨Ø±Ø§Û Ø¯Ø±ÛØ§Ùت Ú©ÙØ§Ø³ Ø¢Ù ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯. سپس ÙÛÚÚ¯ÛnameÙ ÛâØªÙØ§Ùد Ø¨Ø±Ø§Û ÚÙÛ٠بررسÛâÙØ§ÛÛ Ø§Ø³ØªÙØ§Ø¯Ù Ø´ÙØ¯. - Ø¯Ø±Ø¨Ø±Ú¯Ø±ÙØªÙ Ø§Ø³ØªØ«ÙØ§Ø¡Ùا ÛÚ© تکÙÛÚ© ÙÙ
Ù Ø¬Ø§ÙØ¨Ù است: ÛÚ© تابع Ø§Ø³ØªØ«ÙØ§Ø¡ÙØ§Û Ø³Ø·Ø Ù¾Ø§ÛÛ٠را Ù
Ø¯ÛØ±Ûت Ù
ÛâÚ©ÙØ¯ Ù Ø¨Ù Ø¬Ø§Û ØªØ¹Ø¯Ø§Ø¯ Ø²ÛØ§Ø¯Û Ø§Ø±ÙØ± Ø³Ø·Ø Ù¾Ø§ÛÛÙØ Ø§Ø±ÙØ±ÙØ§Û Ø³Ø·Ø Ø¨Ø§ÙØ§ØªØ± Ù
ÛâØ³Ø§Ø²Ø¯. گاÙÛ Ø§ÙÙØ§Øª Ø§Ø³ØªØ«ÙØ§Ø¡ÙØ§Û Ø³Ø·Ø Ù¾Ø§ÛÛ٠ب٠ÙÛÚÚ¯ÛâÙØ§Û Ø¢Ù Ø´ÛØ¡ تبدÛÙ Ù
ÛâØ´ÙÙØ¯ Ù
اÙÙØ¯
err.causeدر ٠ثاÙâÙØ§Û Ø¨Ø§ÙØ§ ا٠ا اÛÙ Ù ÙØ¶Ùع Ø¶Ø±ÙØ±Û ÙÛØ³Øª.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)