در حال بارگذاری...

خطاها

خطا راهی است که تابع با آن ادامه را رد می‌کند. این صفحه سفارش { drink: "tea" } را بدون size دارد. throw new Error("missing size") همان‌جا label را متوقف می‌کند. catch همان Error را می‌گیرد. خط صفحه caught / missing size است.

این صفحهٔ اشکال‌زدایی نیست

صفحهٔ قبل console.error("missing size") را صدا زد و بعد یک متن جایگزین برگرداند. اسکریپت ادامه پیدا کرد. چیزی پرتاب نشد.
throw جور دیگری است. خط‌های بعد از آن در همان تابع اجرا نمی‌شوند. فقط catch می‌تواند ادامه را به دست بگیرد.

Error دو رشته دارد

new Error("missing size") یک شیء می‌سازد. error.name برابر Error است. error.message همان متنی است که دادی، یعنی missing size. چاپ خود شیء کمتر از چاپ این دو فیلد به کار می‌آید.

catch همان Error را می‌گیرد

وقتی size نیست، label خطا پرتاب می‌کند. فراخوانی داخل try است، پس catch اجرا می‌شود و error.message را چاپ می‌کند.

گرفتن نبودن size

javascript
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
try {
console.log(label({ drink: "tea" }));
} catch (error) {
console.log(error.message);
}

لاگ missing size است. label به return نرسید، پس اینجا tea / missing size ساخته نمی‌شود.

سفارش کامل از catch رد می‌شود

به size مقدار regular بده. label عادی برمی‌گردد. catch اجرا نمی‌شود.

سفارش کامل

javascript
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
try {
console.log(label({ drink: "tea", size: "regular" }));
} catch (error) {
console.log(error.message);
}

لاگ tea / regular است.

finally در هر دو حالت اجرا می‌شود

finally بعد از try موفق و بعد از catch اجرا می‌شود. برای کاری است که در هر دو حالت باید انجام شود.

finally بعد از پرتاب

javascript
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
try {
label({ drink: "tea" });
} catch (error) {
console.log(error.message);
} finally {
console.log("done");
}

لاگ‌ها missing size و بعد done هستند.

نام و پیام را بخوان

همان Error را بگیر و دو فیلد را در دو خط چاپ کن.

نام و پیام

javascript
try {
throw new Error("missing size");
} catch (error) {
console.log(error.name);
console.log(error.message);
}

لاگ‌ها Error و بعد missing size هستند.

بررسی پرتاب می‌کند، فراخوان می‌گیرد

requireSize فقط قاعده را می‌داند. خطا پرتاب می‌کند و برچسب نمی‌سازد. تصمیم چاپ با فراخوان است.

جدا کردن بررسی

javascript
function requireSize(order) {
if (!order.size) {
throw new Error("missing size");
}
}
try {
requireSize({ drink: "tea" });
console.log("ok");
} catch (error) {
console.log(error.message);
}

لاگ missing size است. خط console.log("ok") اجرا نمی‌شود، چون پرتاب شدن مستقیم به catch رفته است.

خط زیر فنجان

صفحه label را بدون size صدا می‌زند. catch خط قابل دیدن را از پیام خطا می‌سازد.

نمایش صفحه — خطای گرفته‌شده

html
<!DOCTYPE html>
<html>
<body>
<p id="line">…</p>
<script>
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
let line = "";
try {
line = label({ drink: "tea" });
} catch (error) {
line = "caught / " + error.message;
}
document.getElementById("line").textContent = line;
</script>
</body>
</html>

خط caught / missing size است. سفارش کامل tea / regular را برمی‌گرداند و catch بیکار می‌ماند. fixed / tea / regular مربوط به صفحهٔ اشکال‌زدایی بود.

پشت پیشخوان

  1. label({ drink: "tea" }) را داخل try صدا بزن. لاگ catch برابر missing size است.
  2. label({ drink: "tea", size: "regular" }) را صدا بزن. لاگ tea / regular است و catch اجرا نمی‌شود.
  3. دور فراخوانی ناموفق finally بگذار. لاگ دوم done است.
  4. error.name و error.message را بخوان. لاگ‌ها Error و missing size هستند.
  5. خط صفحه را بخوان: caught / missing size.

اشتباه‌های رایج

throw تابع را متوقف می‌کند. console.error این کار را نمی‌کند.

  • انتظار اجرای خط‌های بعد از throw
  • جا انداختن catch و رها کردن خطای گرفته‌نشده
  • فکر کردن که finally فقط بعد از موفقیت اجرا می‌شود
  • خواندن error.message به‌جای نام Error
  • خواندن خط به‌شکل fixed / tea / regular

جمع‌بندی

  • throw new Error("missing size") پیش از return تابع label را متوقف می‌کند
  • catch همان Error را می‌گیرد و error.message برابر missing size است
  • سفارش کامل tea / regular را لاگ می‌کند و از catch رد می‌شود
  • finally هم بعد از موفقیت اجرا می‌شود و هم بعد از پرتاب
  • خط صفحه: caught / missing size

🧠 دانش خود را بیازمایید

آماده شروع

دانش خود را بیازمایید

خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کرده‌اید

❓
5
سوالات
🎯
70%
برای قبولی
♾️
∞
زمان
🔄
∞
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود