مدیریت استثنا (خطا) در سی شارپ

به خطاهایی که در زمان اجرای برنامه در سی شارپ (به طور کلی تر دات نت فریمورک) رخ می دهند استثنا (به انگلیسی: Exception) گفته می شود. دو نوع استثنا در سی شارپ وجود دارد:

 

استثناهای ایجاد شده توسط CLR

این استثناها به هنگام برخورد با مشکلاتی که وقوع آن ها قبلاً توسط دات نت پیش بینی شده «پرتاب» می شوند (دلیل استفاده از کلمه ی پرتاب در ادامه توضیح داده می شود).

برای مثال کد زیر را در نظر بگیرید:

 

در این کد یک عدد بر صفر تقسیم می شود که این عمل در ریاضی امکان پذیر نیست. بنابراین در صورتی که تلاشی برای اجرای این کد انجام شود در هنگام اجرای کد به همراه Debug (با کلید میانبر F5)، اجرا به محض رسیدن به تقسیم عدد به صفر توسط debugger متوقف (break) شده و به محیط ویژوال استودیو باز خواهیم گشت:

 

همانطور که در تصویر مشاهده می شود کامپایلر یک استثنا از نوع DivideByZeroException گرفته و اخطاری مبنی بر handle نبودن آن داده می شود. اگر برنامه در حالت Debug اجرا نمی شد (برای مثال با انتخاب گزینه Start Without Debugging از منوی Debug) یک exception مدیریت (handle) نشده می توانست باعث کرش کردن برنامه شود. مدیریت استثنا در سی شارپ به عملیاتی گفته می شود که در طی آن قابلیت هایی به کد اضافه می شود تا در برابر هر نوع استثنا عکس العمل مناسب داده شده و از کرش برنامه جلوگیری شود.

در سی شارپ استثناها در واقع کلاس هستند و هنگام بروز خطا از روی استثنای مربوطه شی ساخته می شود (Exception Object). اگر بخواهیم بیشتر به این موضوع وارد شویم باید بدانیم کلاسی به نام Exception وجود دارد که از کلاس Object مشتق شده است. این کلاس خود فرزندی تحت عنوان SystemException دارد که تمامی استثناهای از قبل ایجاد شده ی دات نت فریمورک از این کلاس (و در چند مورد از فرزندان این کلاس) ارث بری می کنند.

 

استثناهای متداول دات نت فریمورک که از قبل ایجاد شده اند

استثناهایی که از کلاس SystemException مشتق شده اند

  • IndexOutOfRangeException: هنگام تلاش کاربر برای دسترسی به عضوی از آرایه که index آن در خارج از محدوده مجاز قرار دارد پرتاب می شود.
  • NullReferenceException: هنگام ارجاع به یک شی null پرتاب می شود.
  • AccessViolationException: هنگام تلاش کاربر برای دسترسی به حافظه نامعتبر (مانند کد مدیریت نشده، کد Unsafe نادرست و یا استفاده از اشاره گر نامعتبر) پرتاب می شود.
  • InvalidOperationException: توسط متد و هنگام رسیدن آن به حالتی نامعتبر پرتاب می شود.
  • ArgumentException: کلاس پایه Argument Exception ها
  • ExternalException: کلاس پایه استثناهایی که در خارج از runtime اتفاق افتاده یا هدفگیری می شوند.

 

استثناهایی که از کلاس ArgumentException مشتق شده اند

  • ArgumentNullException: هنگام قرارگیری یک مقدار null به عنوان آرگومان در یک متد، توسط آن متد پرتاب می شود.
  • ArgumentOutOfRangeException: هنگام قرارگیری یک مقدار خارج از بازه و بی معنی به عنوان آرگومان در یک متد، توسط آن متد پرتاب می شود. البته اگر این مقدار index یک آرایه باشد با استثنای IndexOutOfRangeException روبرو می شویم.

 

مدیریت استثنا در سی شارپ با بلوکی از کد به نام catch (به معنی گرفتن) صورت می‌پذیرد.