javascripttry...catchمدیریت خطا در جاوااسکریپت
try و catch در جاوااسکریپت خطاهای پرتابشده را مدیریت میکنند. خواندن JSON خراب، نمایش پیام روشن و نقش finally را با مثال قابل اجرا یاد بگیرید.
مفهوم به زبان ساده
ممکن است یک عملیات با خطا متوقف شود؛ مثلاً متن فایل تنظیمات، JSON معتبر نباشد. بلوک try بخشی از کد را مشخص میکند که میخواهیم خطای پرتابشدهٔ آن را مدیریت کنیم. اگر خطایی در این مسیر رخ دهد، ادامهٔ همان مسیر try اجرا نمیشود و کنترل به catch میرود. catch فرصت میدهد پیام مناسبی نشان دهیم یا تصمیم دیگری بگیریم؛ خطا را خودکار اصلاح نمیکند.
در مثال، عمداً متنی با قالب خراب به JSON.parse میدهیم. parse یک SyntaxError پرتاب میکند و پیام عادیِ «بارگذاری شد» چاپ نمیشود. در catch بررسی میکنیم خطا از همان نوع مورد انتظار است و پیام قابل فهمی چاپ میکنیم. خطای ناشناخته دوباره پرتاب میشود تا اشکال برنامه پنهان نماند. این تصمیم بهتر از آن است که هر شکست را بیصدا به دادهٔ خالی تبدیل کنیم.
بلوک finally برای کاری است که هنگام خروج عادی از try یا مسیر خطا باید انجام شود؛ مانند برگرداندن وضعیت دکمه پس از پایان عملیات. در این نمونه پیام پایان بررسی را چاپ میکند. از return در finally پرهیز کنید، چون میتواند نتیجه یا خطای مسیر قبلی را بپوشاند. try/catch اطراف ثبت یک callback نیز خطای آیندهٔ آن callback را خودکار نمیگیرد. این مدخل دربارهٔ عملیات همگام است؛ مدیریت انتظار ناهمگام را با #async-await ادامه دهید.
کجا به کار میآید؟
- نمایش پیام مفید برای فایل یا ورودی خراب
- بازیابی وضعیت رابط پس از پایان یک عملیات قابل شکست
از تعریف تا یک مثال واقعی
try {
JSON.parse('{"lessons":}');
console.log('بارگذاری شد');
} catch (error) {
if (!(error instanceof SyntaxError)) throw error;
console.log('فایل تنظیمات قالب درست ندارد');
} finally {
console.log('بررسی تمام شد');
}
فایل تنظیمات قالب درست ندارد بررسی تمام شد
این مثال چطور کار میکند؟
JSON.parse به مقدار لازم پس از دونقطه نمیرسد و خطای نحوی پرتاب میکند.
دستور چاپ بعدی داخل try اجرا نمیشود.
catch نوع خطای مورد انتظار را تشخیص میدهد و پیام فارسی میدهد.
finally پس از این مسیر اجرا میشود و پایان بررسی را اعلام میکند.
اشتباه رایج
catch خالی، علت شکست را پنهان میکند. هر خطا را هم موفقیت یا مقدار صفر فرض نکنید. خطاهای غیرمنتظره را ثبت یا دوباره پرتاب کنید و پیام مناسب کاربر را از اطلاعات عیبیابی جدا نگه دارید.
این را به خاطر بسپارید
خطا را در مرز قابل مدیریت بگیرید؛ علت را پنهان نکنید و finally را به کار پایاندهی اختصاص دهید.