خطاها
خطا راهی است که تابع با آن ادامه را رد میکند. این صفحه سفارش { 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 را چاپ میکند.
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 اجرا نمیشود.
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 اجرا میشود. برای کاری است که در هر دو حالت باید انجام شود.
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 را بگیر و دو فیلد را در دو خط چاپ کن.
try {
throw new Error("missing size");
} catch (error) {
console.log(error.name);
console.log(error.message);
}
لاگها Error و بعد missing size هستند.
بررسی پرتاب میکند، فراخوان میگیرد
requireSize فقط قاعده را میداند. خطا پرتاب میکند و برچسب نمیسازد. تصمیم چاپ با فراخوان است.
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 خط قابل دیدن را از پیام خطا میسازد.
<!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 مربوط به صفحهٔ اشکالزدایی بود.
پشت پیشخوان
label({ drink: "tea" })را داخلtryصدا بزن. لاگ catch برابر missing size است.label({ drink: "tea", size: "regular" })را صدا بزن. لاگ tea / regular است و catch اجرا نمیشود.- دور فراخوانی ناموفق
finallyبگذار. لاگ دوم done است. error.nameوerror.messageرا بخوان. لاگها Error و missing size هستند.- خط صفحه را بخوان: 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
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود