در این مقاله، ما یاد میگیریم که چطور از بلاکهای try-catch استفاده کنیم درحالیکه exception ها را در #C مدیریت میکنیم. علاوه بر این، یاد میگیریم که چطور از چند بلاک catch برای handle کردن exception های بیشتری در کدهایمان استفاده کنیم.
این مقاله، سرفصلی از دوره آموزشی زیر میباشد:
- راه اندازی محیط توسعه
- Data Type ها، Declaration ها و تعریف متغیرها در #C
- عملگرها در #c
- تبدیل نوع های داده ای
- ورودی و خروجی در #c
- کار با رشته ها
- شرطها در #c
- حلقه ها (While، Do-While، For)
- مدیریت خطاها
- Access Modifier ها
- متدها
- کلمات کلیدی Ref و Out
- بازگشت و متدهای بازگشتی
- آرایه ها (آرایه های تک بعدی و چند بعدی)
- کار با فایلها، StreamWriter و StreamReader
- کار با فایلها، File و Directory
اگر می خواهید محتویات کامل این دوره را ببینید ، می توانید بر روی لینک مبانی #c کلیک کنید.
اگر میخواهید کد سورس مثالهای این مقاله را دانلود کنید اینجا کلیک کنید.
این مقاله شامل موضوعات زیر میباشد:
Exception چیست؟
exception یک مشکلی است که در حالیکه در حل توسعه پروژه هستیم به صورت غیرمنتظره در کدهایمان رخ میدهد. به این دلیل است که ما این exception ها را exception های handle نشده مینامیم. اگر این exception ها handle نشوند در نتیجه اپلیکیشن ما از کار می افتد و یک پیغام خطا throw میکند. ما نمیخواهیم همچین اتفاقی رخ دهد.
بلاک Try-Catch
#C یک پشتیبانی توکار برای handle کردن این exception ها با استفاده از بلاک try-catch در اختیار ما قرار میدهد:
1 2 3 4 5 6 7 8 |
try { // expressions that could cause an exception } catch(Exception ex) { // handle exception } |
در بلاک try
، ما کدهایمان را مینویسیم و بلاک catch
، تمام exception هایی که امکان دارد در بلاک try اتفاق بیفتد را handle میکند. با این شیوه، برنامه ما اصلا stop نمیشود و ما میتوانیم پیغامهای معناداری را به کاربر نمایش دهیم.
ببینیم برنامه ما چطور با handle کردن و بدون handle کردن exception ها کار میکند.
مثال 1: یک برنامه ای بنویسید که یک عدد صحیح از کاربر گرفته و جذر آن را در خروجی چاپ نماید:
1 2 3 4 5 6 7 8 9 10 |
class Program { static void Main(string[] args) { Console.WriteLine("Enter your number: "); int num = Convert.ToInt32(Console.ReadLine()); Console.WriteLine(Math.Sqrt(num)); } } |
این کد فقط در صورتی درست کار میکند که کاربر یک عدد صحیح وارد نماید. اما ببینید که چه اتفاقی می افتد اگر کاربر به جای عدد یک رشته وارد کند:

ما میبینیم که در این حالت، اپلیکیشن ما متوقف شده است. این اتفاق به عنوان یک تجربه کاربری خیلی ناخوشایند است. حالا اجازه بدید همین کد را اینبار با بلاک try-catch پیاده سازی کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Program { static void Main(string[] args) { try { Console.WriteLine("Enter your number: "); int num = Convert.ToInt32(Console.ReadLine()); Console.WriteLine(Math.Sqrt(num)); Console.ReadKey(); } catch (Exception ex) { Console.WriteLine($"There is something wrong in our application, please look at this message: {ex.Message}"); Console.ReadKey(); } } } |
اگر حالا نتیجه را بررسی کنیم:

همانطور که میبینیم، برنامه ما در این حالت متوقف نشده است و یک پیام با مفهوم برای کاربرمان داریم که یک تجربه کاربری بهتری را نسبت به مثال قبلی ارائه میدهد.
Exception های ویژه
#C مجموعه exception های خاص خودش را دارد که ما میتوانیم در در اپلیکیشنمان استفاده کنیم. تعدادی از آنها عبارتند از: NullReferenceException، ArgumentOutOfRangeException، InvalidCastException، FileNotFoundException، DevideByZeroException، FormatException، InvalidOperationException و غیره.
ما میتوانیم آنها را به این صورت استفاده کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public class Program { public static void Main() { try { //Code in here that could cause an exception } catch (DivideByZeroException ex) { Console.Write("Cannot divide by zero. Please try again."); } catch (InvalidOperationException ex) { Console.Write("Not a valid number. Please try again."); } catch (FormatException ex) { Console.Write("Not a valid number. Please try again."); } catch(Exception ex) { Console.Write("Any exception that previous catch blocks didn’t handle."); } Console.ReadKey(); } } |
این خیلی مهم است که بلاکهای catch
ویژه را قبل از بلاک catch
عمومی قرار دهیم در غیر اینصورت کامپایلر ما خطای زیر را خواهد گرفت:

نتیجه گیری
بسیار عالی
حالا ما میدانیم که چطور یک کد امن بنویسیم و چطور خطاها را در اپلیکیشنمان handle کنیم.
در مقاله بعدی، ما در مورد Access Modifier ها در #C صحبت میکنیم.