javascriptthrow and Errorپرتاب خطا با throw در جاوااسکریپت
با throw در جاوااسکریپت شکست قرارداد را آشکار کنید؛ ساخت RangeError، نام و پیام خطا و انتقال کنترل به catch را در مثال تعداد کالا یاد بگیرید.
مفهوم به زبان ساده
تابع نباید برای ورودی نامعتبر همیشه نتیجهای شبیه موفقیت بسازد. وقتی قرارداد تابع میگوید تعداد باید عدد صحیح مثبت باشد، مقدار صفر را میتوان با خطای روشن رد کرد. throw خطا یا مقدار دادهشده را پرتاب میکند و اجرای مسیر فعلی را متوقف میکند. اگر catch مناسبی در زنجیرهٔ فراخوانی وجود داشته باشد، کنترل به آن میرسد؛ در غیر این صورت خطا مدیریتنشده باقی میماند.
در نمونه از RangeError استفاده میکنیم تا محدودیت مقدار را بیان کنیم. خطا شیئی با ویژگیهایی مانند name و message است؛ پیامِ انتخابشده، دلیل و راه اصلاح ورودی را روشن میکند. تابع برای مقدار مجاز همان عدد را برمیگرداند، اما برای صفر به return موفق نمیرسد. نمایش پیام به کاربر را بیرون از تابع بررسی داده انجام میدهیم.
جاوااسکریپت اجازه میدهد رشته یا مقدارهای دیگری هم پرتاب شوند، ولی استفاده از Error و زیرنوعهای آن قرارداد قابل فهمتری برای عیبیابی میسازد. catch نباید همهٔ خطاهای برنامه را بیصدا به صفر تبدیل کند. فقط خطایی را که در آن مرز میدانید چگونه مدیریت کنید بگیرید و خطای ناشناخته را پنهان نکنید. برای تمرین، عدد منفی، اعشار و یک مقدار معتبر را جدا امتحان کنید.
کجا به کار میآید؟
- ردکردن ورودی نامناسب در مرز تابع بررسی داده
- جداسازی مسیر شکست از مقدار موفق محاسبه
از تعریف تا یک مثال واقعی
function checkQuantity(value) {
if (!Number.isInteger(value) || value < 1) {
throw new RangeError('تعداد باید صحیح و مثبت باشد');
}
return value;
}
try {
console.log(checkQuantity(2));
checkQuantity(0);
} catch (error) {
if (!(error instanceof RangeError)) throw error;
console.log(error.name);
console.log(error.message);
}
2 RangeError تعداد باید صحیح و مثبت باشد
این مثال چطور کار میکند؟
ورودی ۲ معتبر است و مقدار آن چاپ میشود.
صفر شرط قرارداد را نقض میکند و RangeError پرتاب میشود.
catch خطای مورد انتظار را میگیرد و نام و پیام آن را نمایش میدهد.
اشتباه رایج
خطا را مانند نتیجهٔ موفق نادیده نگیرید. ساختن new Error بهتنهایی آن را پرتاب نمیکند؛ برای انتقال کنترل، throw لازم است.
این را به خاطر بسپارید
throw شکست را در مسیر اجرا آشکار میکند؛ شیء Error اطلاعات منظمتری برای مدیریت و عیبیابی میدهد.