Exception Handling در سی شارپ، به معنی استفاده از ساختارهای خاص برای مدیریت خطاها هنگام اجرای برنامه است. «Exception» یا «استثنا»، مشکلی است که در زمان اجرای برنامههای کامپیوتری به وجود میآید. مشکلی که برنامه انتظار روبهرو شدن با آن را ندارد. در چنین مواردی، برنامه نمیداند با مشکل به وجود آمده چگونه باید رفتار کند. برای مدیریت چنین موقعیتهایی، برنامه نویس باید از تکنیکها و ابزارهای مربوط به Exception Handling در سی شارپ استفاده کند. برنامه نویس با کمک کدهای مربوط به مدیریت خطا، از توقف یا کرش کردن اپلیکیشن جلوگیری میکند. به این کار، «مدیریت خطای استثنا» یا «Exception Handling» گفته میشود.
آنچه در این مطلب میآموزید:
-
سینتکس کامل برای اجرای تکنیک Exception Handling را میآموزیم.
-
با کلاسهای مختلفی که در سی شارپ برای اعلان استثناها تعریف شده آشنا میشویم.
-
انواع روشهای پیادهسازی Exception Handling در سی شارپ را میآموزیم.
-
یاد میگیریم که خودمان چگونه خطای مورد نظر خود را تعریف کرده و آن را مدیریت کنیم.
-
تکنیک نوشتن بلوکهای «Try-Catch» را به صورت تو در تو میآموزیم.

بنابراین در این مطلب از مجله فرادرس به بررسی Exception Handling در سی شارپ پرداختهایم. از تعریف کامل این تکنیک شروع کرده و انواع ساختارهای مورد استفاده برای پیادهسازی آن را مانند try و catch و finally و throw بررسی کردهایم. همچنین روش پیادهسازی ساختارهایی مانند بلوک «Try-Catch» را به صورت تو در تو توضیح دادهایم. Exception Handling بسیار مهم است. توسعهدهنده با کمک این تکنیک، با مشکلات به وجود آمده به روش صحیح، برخورد میکند. مهمترین فایده استفاده از این تکنیک آن است که برنامه به کار خود ادامه میدهد و کاربر با خطای ناگهانی روبهرو نمیشود.
Exception Handling در سی شارپ چیست؟
Exception Handling در سی شارپ یعنی انجام کارهای خاص برای مدیریت خطاهای استثنایی که در زمان اجرای برنامه به وجود میآیند. برای انجام این کارها از کلمات کلیدی try و catch و finally و throw استفاده میکنیم.
در فهرست زیر این کلمات کلیدی را معرفی کردهایم.
- try: کلمه کلیدی try، بلوک خاصی از کدها را مشخص میکند. توسعهدهندگان پیشبینی میکنند که در این کدهای خاص شاید بعضی از خطاهای استثنا فعال شوند. پس کدهای این بخش را در بلوک try قرار میدهند. همیشه بعد از بلوک try یک یا چند بلوک catch قرار میگیرد.
- catch: برنامههای زبان سی شارپ میتوانند با کمک «کنترل کنندههای استثنا» (Exception Handler)، خطاهای مختلفی را مدیریت میکنند. توسعهدهندگان مشخص میکنند که مدیریت خطا در کدام بخش از برنامه اتفاق بیافتد. برای مشخص کردن محل دریافت و مدیریت استثنای مورد نظر از کلمه کلیدی catch استفاده میکنیم.
- finally: از بلوک finally برای اجرای قطعی مجموعهای از دستورات، استفاده میکنیم. بدون توجه به اینکه خطای خاصی رخ داده یا نه، کدهای بلوک finally اجرا میشوند. برای مثال، هر وقت برنامه نویس فایلی را باز میکند، بدون در نظر گرفتن اینکه آیا خطایی رخ داده است یا نه، بعد از انجام همه کارها این فایل باید دوباره بسته شود. برای مشخص کردن این بلوک از کلمه کلیدی finally استفاده میکنیم.
- throw: وقتی که برنامهها با مشکل خاصی در اجرا روبهرو شوند، این کلمه کلیدی، خطای استثنای مرتبط با آن مشکل را اعلام میکند. در زبان انگلیسی برای اعلام خطا در زمان اجرای برنامهها از اصطلاح «پرتاب کردن» (Throw) استفاده میشود. در سی شارپ هم از کلمه کلیدی throw برای اعلام خطا استفاده میشود.

سینتکس پایه Exception Handling در سی شارپ
فرض کنیم که بلوکی از کد باعث برخواستن خطای خاصی شده است. متدها میتوانند با استفاده از ترکیب کلمات کلیدی try و catch خطای اعلام شده را شناسایی کرده و دریافت کنند. همیشه کدی که احتمال روبهرو شدن با خطا دارد را در بلوک «Try-Catch» قرار میدهیم. کد محصور شده در این بلوک به عنوان کد امن در نظر گرفته میشود. در پایین، سینتکس مربوط به استفاده از بلوک «Try-Catch» را نمایش دادهایم.
برنامه نویسان میتوانند از چندین عبارت catch مختلف برای مدیریت انواع استثناهای موجود در کد استفاده کنند. زیرا بلوکهای try با توجه به شرایط مختلف، ممکن است بیش از یک خطای استثنا برگردانند.

کلاسهای مختلف Exception در سی شارپ
در زبان برنامه نویسی سی شارپ، خطاهای Exception با کمک کلاسها نمایش داده میشوند. در واقع، تمام کلاسهای Exception به صورت مستقیم یا غیرمستقیم از کلاس System.Exception مشتق شدهاند. System.ApplicationException و System.SystemException دو مورد از خطاهایی هستند که به صورت مستقیم از کلاس System.Exception ارثبری کردهاند.
- System.ApplicationException: این کلاس از تمام خطاهای تولید شده توسط برنامههای کاربردی، پشتیبانی میکند. بنابراین Exception-هایی که توسط برنامه نویسان تعریف میشوند، باید از این کلاس مشتق شوند.
- System.SystemException: این کلاس، کلاس پایه تمام Exception-هایی است که از پیش توسط سیستم، تعریف شدهاند.
در فهرست زیر، چند مورد از Exception-های ازپیشتعریف شده توسط سیستم را معرفی کردهایم. این خطاهای استثنا، همگی از کلاس System.SystemException ارثبری کردهاند.
- System.IO.IOException: تمام خطاهای مربوط به بخش ورود و خروج اطلاعات یا I/O را مدیریت میکند.
- System.IndexOutOfRangeException: این کلاس Exception، خطاهایی را مدیریت میکند که بر اثر درخواست دسترسی به اندیس خارج از محدوده آرایه به وجود میآیند.
- System.ArrayTypeMismatchException: در زمان اجرای برنامهها اگر نوع متغیر خاصی با نوع آرایه مطابقت نداشته باشد، خطای ArrayTypeMismatchException اعلام میشود. این Exception چنین خطاهایی را مدیریت میکند.
- System.NullReferenceException: اگر در زمان برنامه نویسی به اشیائی اشاره کنیم که مقدار «Null» دارند، با خطا روبهرو میشویم. این کلاس، آن خطا را مدریت میکند.
- System.DivideByZeroException: در محاسبات برنامه نویسی، تقسیم هر مقداری بر عدد صفر، باعث برخواست خطا میشود. از این Exception برای مدیریت آن خطا استفاده میشود.
- System.InvalidCastException: این کلاس Exception، وظیفه مدیریت تمام خطاهایی را دارد که در زمان «تبدیل نوع» (Type Casting) به وجود میآیند.
- System.OutOfMemoryException: این کلاس Exception، خطاهای ایجاد شده به دلیل ناکافی بودن حافظه خالی را مدیریت میکند.
- System.StackOverflowException: گر تابعی به صورت بازگشتی بیش از حد اجرا شود، حافظه پشته پر میشود. در نتیجه اجرای برنامه به مشکل برمیخورد. این کلاس، این نوع خطا را مدیریت میکند.
یادگیری سی شارپ با کمک فیلمهای پروژه محور فرادرس
بهترین روش برای یادگیری هر تکنولوژی و دانشی، استفاده از آن است. زبان برنامه نویسی سی شارپ هم چنین ویژگی دارد. با اینکه سینتکس این زبان نسبتا ساده بوده و ساختار منسجمی دارد، اما مفاهیم بسیار زیاد و متنوعی در آن وجود دارند. Exception Handling در سی شارپ یکی از این موارد است. از مفاهیم ابتدایی مانند حلقهها در سی شارپ گرفته تا مفاهیم پیشرفتهای مانند شیء گرایی در سی شارپ، هر کدام جزئیات فراوانی دارند. بهترین روش برای یادگیری این مفاهیم و جزئیات آنها به کار بردنشان در پروژههای واقعی و عملی است.

برای کمک به یادگیری هرچه بهتر سی شارپ و اجرای پروژههای واقعی با کمک این زبان، فرادرس فیلمهای آموزشی پروژهمحوری را تولید کرده است. زبان C# کاربردهای متنوعی مانند توسعه وباپلیکیشنها، نرمافزارهای دسکتاپ و بازیسازی دارد. هر کدام از این فیلمها نیز نوع خاصی از پروژهها را پوشش میدهند. بنابراین تکنولوژیهای به کار رفته در آنها با هم فرق میکنند. با تماشای این فیلمها روش ساخت نمونهکارهای حرفهای و جذاب را یاد میگیرید. در پایین، چند فیلم پروژهمحور از فرادرس را معرفی کردهایم.
برای دیدن سایر فیلمها بر روی تصویر بالا کلیک کرده و به صفحه اصلی این مجموعه آموزشی هدایت شوید. در ادامه، روش اجرای Exception Handling در سی شارپ را توضیح دادهایم.
اجرای Exception Handling در سی شارپ
زبان برنامه نویسی سی شارپ برای انجام Exception Handling راه حل منظم و منسجمی را ارائه داده است. این راه حل شامل استفاده از بلوکهای try و catch میشود. با استفاده از این بلوکها عبارتهای اصلی برنامه از بخش مربوط به مدیریت خطا جدا میشوند. بلوکهای مربوط به «مدیریت خطا» (Error Handling) با استفاده از کلمات کلیدی try و catch و finally پیادهسازی میشوند.
مدیریت خطا در همه زبانهای برنامه نویسی، به دو بخش مهم تقسیم میشود. در زبان سی شارپ هم همین قائده برقرار است. بخشی مربوط به مدیریت خطاها و استثناهای احتمالی در زمان اجرای برنامه است. این بخش را در این مطلب توضیح دادهایم. بخش دیگر به شناسایی و رفع خطاهای منطقی، سینتکس یا غیره در کدها مربوط میشود. برای کسب مهارت در انجام این کارها میتوانید فیلم آموزش «ویژوال استودیو» (Visual Studio) و خطایابی کدهای سی شارپ در این IDE را از فرادرس مشاهده کنید. لینک مربوط به این فیلم را در پایین نیز قرار دادهایم.
کدهای پایین به شکلی نوشته شدهاند که برنامه با خطای تقسیم بر صفر روبهرو شود. وقتی که این اتفاق روی میدهد، خود برنامه به صورت خودکار از تکنیک Error Handling استفاده کرده و در خروجی، متن مناسبی را برای خطا چاپ میکند.
بعد از کامپایل شدن و اجرای کد بالا، نتیجه زیر تولید شده و در کنسول سی شارپ نمایش داده میشود.
Exception caught: System.DivideByZeroException: Attempted to divide by zero. at ... Result: 0
Exception-های تعریف شده توسط کاربر
برنامه نویسان میتوانند Exception مخصوص خود را تعریف کنند. تمام Exception تعریف شده توسط کاربر، باید از کلاس Exception ارثبری کنند. برای درک بهتر روش انجام این کار، لازم است که با مفهوم ارث بری در سی شارپ آشنایی کافی داشته باشید. در صورت نیاز به کسب اطلاعات در این زمینه، پیشنهاد میکنیم که مطلب مربوط به این موضوع را در مجله فرادرس مطالعه کنید.
در کادر زیر، مثال سادهای را درباره روش تعریف Exception بررسی کردهایم.
بعد از کامپایل شدن و اجرای کد بالا، نتیجه زیر تولید شده و در کنسول سی شارپ نمایش داده میشود.
TempIsZeroException: Zero Temperature found
اعلان خطای استثنا
اگر خطای استثنایی به طور مستقیم یا غیرمستقیم از کلاس System.Exception ارث برده باشد، برنامه نویس میتواند آن را اعلام کند. برای این کار میتوان از دستور throw در بلوک catch استفاده کرد.

در پایین سینتکس مورد استفاده برای اعلام کردن خطای Exception را نوشتهایم.
در کد زیر روش دریافت Exception را پیادهسازی کردهایم. سپس Exception دریافت شده را دوباره به کاربر اعلام کردیم.
بعد از کامپایل شدن و اجرای کد بالا، نتیجه زیر تولید شده و در کنسول سی شارپ نمایش داده میشود.
Caught inside DivideNumbers method. Exception caught in Main: Attempted to divide by zero.
نوشتن چند بلوک Catch
برای هر بلوک try، برنامه نویس میتواند چند بلوک catch بنویسد. با کمک بلوکهای catch میتوان انواع مختلف خطاها را جداگانه مدیریت کرد. در مثال زیر، روش استفاده از چند بلوک catch را نمایش دادهایم. هر کدام از بلوکهای catch نوع خاصی از Exception-ها را دریافت و مدیریت میکند.
بعد از کامپایل شدن و اجرای کد بالا، نتیجه زیر تولید شده و در کنسول سی شارپ نمایش داده میشود.
IndexOutOfRangeException caught: Index was outside the bounds of the array.
بلوک های «Try-Catch» به صورت تو در تو
در زبان برنامه نویسی سی شارپ میتوانیم بلوک «Try-Catch» را به صورت تو در تو هم تعریف کنیم. یعنی اینکه در داخل هر بلوک try میتوانیم یک بلوک «Try-Catch» جدا قرار بدهیم. از این تکنیک برای مدیریت جریانهای کاری پیچیده استفاده میشود.
در مثال زیر، بلوک «Try-Catch» را به شکل تو در تو پیادهسازی کردهایم.
بعد از کامپایل شدن و اجرای کد بالا، نتیجه زیر تولید شده و در کنسول سی شارپ نمایش داده میشود.
Inner catch: Attempted to divide by zero. Outer catch: Attempted to divide by zero.
چگونه در فرادرس سی شارپ یاد بگیریم؟
سایت تولید محتوای فرادرس به عنوان بزرگترین آموزشگاه آنلاین کشور، منابع زیاد و گوناگونی برای آموزش سی شارپ تهیه کرده است. یکی از این منابع، فیلمهای آموزشی هستند. استفاده از فیلمهای آموزشی نسبت به سایر منابع، ارزش بیشتری دارد. زیرا این فیلمها مقرونبهصرفه، دائمی و با کیفیت هستند. فیلمهای آموزشی فرادرس بسیار کامل و همراه با مثالهای متنوع، تولید شدهاند. استفاده از این فیلمها کیفیت یادگیری را افزایش میدهد. در فهرست زیر، چند فیلم آموزشی درباره زبان برنامه نویسی سی شارپ را معرفی کردهایم. این فیلمها توسط فرادرس تولید شدهاند.
برای دیدن فیلمهای بیشتر بر روی تصویر پایین، کلیک کنید.

استفاده از بلوک Finally
گاهی از اوقات لازم است که دستورات خاصی حتما در برنامه، اجرا شوند. این دستورات، بدون در نظر گرفتن اینکه خطایی رخ داده است یا نه اجرا میشوند. برای نوشتن چنین دستوراتی از بلوک finally استفاده میکنیم. چه کدهای نوشته شده با موفقیت اجرا شوند و چه مشکل داشته باشند، دستور داخل بلوک finally همیشه اجرا میشود. بیشترین استفاده از این بلوک برای آزاد کردن منابع اشغال شده است. به عنوان مثال، میتوان به بستن فایلهای باز یا قطع کردن ارتباطات برقرار شده با پایگاه داده اشاره کرد.
در کد زیر، روش استفاده از بلوک finally را با کمک مثال سادهای بررسی کردهایم.
بعد از کامپایل شدن و اجرای کد بالا، نتیجه زیر تولید شده و در کنسول سی شارپ نمایش داده میشود.
Inside try block. Result: 5 Finally block executed.
جمعبندی
Exception در سی شارپ، به معنای واکنش برنامه به یک وضعیت غیرعادی یا استثنایی است. این شرایط معمولا در هنگام اجرای برنامه رخ میدهند. برای مثال، تقسیم هر مقدار عددی بر صفر، Exception ایجاد میکند. Exception-ها روشی برای انتقال کنترل برنامه از یک بخش به بخش دیگر آن فراهم میکنند. به استفاده از مجموعهای از تکنیکها و ابزارها برای مدیریت خطا در سی شارپ، Exception Handling گفته میشود. تمام عملیات مربوط به مدیریت Exception در سی شارپ با استفاده از چهار کلمه کلیدی try و catch و finally و throw انجام میشود.
در این مطلب از مجله فرادرس با مفهوم exception handling در سی شارپ آشنا شدهایم. در این زبان، هم میتوان خطاهای تعریف شده توسط سیستم را مدیریت کرد و هم خطاهایی که برنامهنویس تعریف میکند. در ضمن میتوانیم بلوک «Try-Catch» را به صورت تو در تو بنویسم. با استفاده از این تکنیک دیگر برنامه متوقف نشده و کرش نمیکند. در نتیجه کاربر هم با تجربه کاربری بد روبهرو نمیشود. برای نوشتن برنامههای حرفهای در سی شارپ و ارائه آن به مشتریان واقعی، لازم است که تمام بخشهای مربوط به Exception Handling را به خوبی پیادهسازی کنیم.
source