69- آموزش جاوااسکریپت | مدیریت خطاها در جاوااسکریپت با بلوک Try...Catch
در این آموزش با ساختار try...catch در جاوااسکریپت، انواع خطاهای سیستمی مانند ReferenceError و TypeError، نحوه تولید خطاهای سفارشی با کلمه کلیدی throw و استفاده از بلوک finally آشنا میشوید.
مدیریت صحیح خطاها یکی از اصول حیاتی در برنامهنویسی جاوااسکریپت است. با استفاده از ساختار try...catch میتوان کدهایی نوشت که در صورت بروز خطا، اجرای کل برنامه متوقف نشود و بتوان رفتار مناسبی را در برابر خطاها نشان داد.
ساختار Try...Catch چیست؟
ساختار try...catch از دو بخش اصلی تشکیل شده است:
- بلوک try: کدهایی را که احتمال بروز خطا در آنها وجود دارد، درون این بلوک قرار میدهیم.
- بلوک catch: در صورت بروز هرگونه خطا در بلوک try، کنترل برنامه بلافاصله به این بلوک منتقل میشود تا خطا مدیریت شود.
try {
// کدی که تست میشود
myFunction();
} catch (e) {
// مدیریت خطا
console.log(e);
}
اگر تابع myFunction تعریف نشده باشد، یک خطای مرجع یا ReferenceError رخ میدهد. به کمک catch این خطا گرفته شده و در کنسول نمایش داده میشود، اما اجرای برنامه متوقف نمیشود:
try {
myFunction();
} catch (e) {
console.log(e);
}
console.log('برنامه همچنان ادامه دارد...');
اگر دستور اول خارج از try...catch اجرا میشد، کل اسکریپت از کار میافتاد و دستور console.log بعدی هرگز اجرا نمیشد.
ویژگیهای شیء خطا (Error Object)
شیء خطایی که به بلوک catch پاس داده میشود (در اینجا به نام e یا error)، ویژگیهای کاربردی متعددی دارد:
۱. ویژگی message
فقط متن پیام خطا را بدون نوع آن برمیگرداند:
console.log(e.message); // خروجی: myFunction is not defined
۲. ویژگی name
نوع یا نام خطای رخداده را برمیگرداند:
console.log(e.name); // خروجی: ReferenceError
۳. بررسی نوع خطا با instanceof
با استفاده از عملگر instanceof میتوان نوع دقیق خطا را بررسی کرد:
console.log(e instanceof ReferenceError); // true
console.log(e instanceof TypeError); // false
بلوک Finally
بلوک finally بخشی اختیاری است که بعد از try و catch میآید و کدهای داخل آن در هر حالتی (چه خطا رخ دهد و چه رخ ندهد) اجرا خواهند شد:
try {
myFunction();
} catch (e) {
console.log(e.message);
} finally {
console.log('این بخش در هر صورت اجرا میشود.');
}
انواع خطاهای رایج در جاوااسکریپت
۱. خطای نوع (TypeError)
زمانی رخ میدهد که مقداری از یک نوع داده غیرمنتظره استفاده شود؛ مثلاً فراخوانی یک متد روی مقدار null:
try {
const user = null;
user.myFunction(); // خطا: امکان خواندن متد از مقدار null وجود ندارد
} catch (e) {
console.log(`${e.name}: ${e.message}`);
}
۲. خطای سینتکس (SyntaxError)
زمانی رخ میدهد که کدهای نوشتهشده با قوانین نگارشی جاوااسکریپت همخوانی نداشته باشند. به عنوان مثال، ارزیابی یک رشته نامعتبر با تابع eval:
try {
eval('Hello World'); // خطا در ساختار کد
} catch (e) {
console.log(`${e.name}: ${e.message}`);
}
۳. خطای URI (URIError)
زمانی رخ میدهد که از توابع کدگذاری یا رمزگشایی URI (مانند decodeURIComponent) به شکل نادرست استفاده شود:
try {
decodeURIComponent('%'); // درصد تنها معتبر نیست و خطا میدهد
} catch (e) {
console.log(`${e.name}: ${e.message}`);
}
تولید خطاهای سفارشی با Throw
گاهی نیاز است بر اساس منطق برنامه و به صورت دستی خطایی ایجاد کنیم. برای این کار از کلمه کلیدی throw استفاده میشود. میتوان یک رشته متنی ساده یا شیء خطای استاندارد مانند SyntaxError را پرتاب کرد:
const user = { email: 'johndoe@gmail.com' };
try {
if (!user.name) {
// پرتاب یک خطای سینتکس سفارشی
throw new SyntaxError('کاربر نام کاربری ندارد');
}
} catch (e) {
console.log(`خطای کاربر: ${e.message}`);
}
با این روش، علاوه بر مدیریت منطق برنامه، اطلاعات دقیقی مانند شماره خط و نام فایل نیز در کنسول ثبت خواهد شد تا خطایابی سریعتر انجام شود.