حل مشکل خطاهای در حال اجرا - بخش دوم

خطا در دست‌های شماست

در شماره پیش در مورد ساختار try-catch-finally توضیح دادیم و این‌که هر قطعه کد در چه بخشی اجرا خواهد شد و اگر هنگام اجرای برنامه خطا پیش آمد، چه کاری باید انجام دهیم. در شماره پیش بحث‌ها کاملا مقدماتی و تئوری بود و در این شماره با این مبحث بیشتر آشنا می‌شویم و موارد استفاده از این ساختار را بررسی خواهیم کرد.
کد خبر: ۵۰۲۶۱۶

شاید برای شما هم این سوال پیش بیاید که این ساختار چگونه کار می‌کند و از آنجا که همیشه کد‌هایی که در این ساختار اجرا می‌شود باید منتظر یک اعلان (رخداد خطا) باشد، استفاده از این ساختار مقرون به صرفه است یا خیر؟

جواب این سوال مستلزم آن است که بدانیم این ساختار چگونه کار می‌کند، آیا واقعا آن طور که ما فکر می‌کنیم از منابع سیستم ما بیش از حد استفاده می‌کند و این‌که راه برون‌رفتی برای استفاده از این ساختار وجود دارد یا خیر؟

پیاده‌سازی این ساختار به عهده کامپایلر است. چگونگی انجام این کار بستگی به زبانی دارد که دارید با آن کد می‌نویسید. هر طور که این کار را انجام دهد باز سرباری روی سیستم شما دارد؛ اما هزینه ازدست‌رفتن اطلاعات سیستم یا مشکلات دیگر خیلی بیشتر از سرعت پایین آن بوده که ممکن است بر اثر استفاده از این ساختار بر سیستم شما تحمیل شود (البته در طراحی کامپایلرها سعی شده این مورد به کمترین حد ممکن برسد)، البته بعضی از خطاها را می‌توان بدون استفاده از این ساختار نیز مدیریت کرد، برای مثال این‌که یک فایل وجود دارد یا خیر؟ این‌که می‌توانیم به یک فایل دسترسی داشته‌باشیم یا خیر، یا تقسیم بر صفر و...، پیشنهاد می‌شود خطاها را تا جایی که ممکن است بدون استفاده از این ساختار مدیریت کنید.

به دو قطعه کد زیر دقت کنید:

try{ }

catch{ }

try{ }

catch(Exception ex){ }

قبل از توضیح باید پرسید که Exception در کد بالا چیست؟ هر خطایی که در برنامه رخ می‌دهد یک شی از کلاس Exception ایجاد می‌کند و آن را throw (پرتاب می‌کند) و در یک catch گرفته خواهد شد. این شی اطلاعاتی در مورد خطای رخ داده در خود دارد، و دارای ویژگی‌هایی است که دوتا از آنها مهم هستند؛ یکی Message و دیگری InnerException.

Message پیغام خطا را مشخص می‌کند؛ یعنی این‌که چه خطایی در سیستم رخ داده است. مورد دیگر InnerException است، این ویژگی خودش یک شی از کلاس Exception است، که مشخص می‌کند خطایی که رخ داده در چه سطحی قرار دارد. ممکن است در یک تابع خطا رخ دهد و این خطا به تابع فراخواننده آن برود و در تابعی که آن تابع را فراخوانی کرده گرفته شود. در این زمان InnerException مقدار می‌گیرد و مشخص می‌کند خطا در چه مرحله‌ای رخ داده است.

همان طور که گفتیم Exception یک کلاس است، پس شامل قوانین شی‌گرا می‌شود و می‌توان کلاس‌هایی را از آن ایجاد کرد. این کلاس‌ها می‌تواند یک Exception دیگر باشد و هر یک برای مقصود خاصی استفاده شوند؛ برای مثال در دات نت چند کلاس برای خطاهای مختلف وجود دارد. به کد زیر دقت کنید:

int[] nums = new int[4];

try {

;k10; i++) { for(int i=o

nums[i] = i; } }

catch (IndexOutOfRangeException) { }

همان طور که می‌بینید در کد بالا ما می‌خواهیم به عنصری از آرائه دسترسی پیدا کنیم که وجود ندارد. این کار باعث بروز خطای IndexOutOfRangeException می‌شود. IndexOutOfRangeException از جمله خطاهایی است که برنامه نویسان دات نت آن را پیاده کرده‌اند. اما شما هم می‌توانید برحسب نیازتان یک خطا ایجاد و از آن استفاده کنید.

در توضیح تفاوت دو قطعه کد بالا، باید اشاره کنیم در حالتی که catch نوشته شده، تمامی خطاهایی که در طول اجرای کد شما ایجاد می‌شود توسط ساختار try-catch گرفته می‌شود؛ اما در حالت بعدی تمامی خطاهایی که از کلاس Exception ارث‌بری داشته‌اند، گرفته می‌شود.

همان طور که توضیح دادیم خود شما می‌توانید یک خطا ایجاد کنید، اما آیا ما می‌توانیم یک خطا را پرتاب کنیم؟

جواب بله است، به کد زیر دقت کنید:

throw new IndexOutOfRangeException

( اندیس مورد نظر وجود ندارد);

متن رشته‌ای اندیس مورد نظر وجود ندارد متن خطای ماست که در واقع همان مقدار Message است.

امیر​بهاالدین سبط​الشیخ

newsQrCode
ارسال نظرات در انتظار بررسی: ۰ انتشار یافته: ۰

نیازمندی ها