دستورات try و catch
میتوان خطاها را با استفاده از دستور try…catch اداره کرد. بدین صورت که کدی را که احتمال میدهید ایجاد خطا کند در داخل بلوک try قرار میدهید. بلوک catch هم شامل کدهایی است که وقتی اجرا میشوند که برنامه با خطا مواجه شود. تعریف سادهی این دو بلوک به این صورت است که بلوک try سعی میکند که دستورات را اجرا کند و اگر در بین دستورات خطایی وجود داشته باشد برنامه دستورات مربوط به بخش catch را اجرا میکند. برنامه زیر نحوه استفاده از دستور try…catch را نمایش میدهد :
1: using System; 2: 3: public class Program 4: { 5: public static void Main() 6: { 7: int result; 8: int x = 5; 9: int y = 0; 10: 11: try 12: { 13: result = x / y; //ERROR 14: } 15: catch 16: { 17: Console.WriteLine("An attempt to divide by 0 was detected."); 18: } 19: 20: } 21: }
An attempt to divide by 0 was detected.
در داخل بلوک try، مقدار x را که 5 است بر y که مقدار آن 0 است تقسیم کردهایم. نتیجه محاسبه به وجود آمدن خطای DivideByZeroException (عدد تقسیم بر صفر) است. از آنجاییکه در برنامه بالا خطایی به وجود آمده است کدهای داخل بلوک catch اجرا میشوند. بنابراین :
try { result = x / y; //Error: Jump to catch block Console.WriteLine("This line will not be executed."); } catch { Console.WriteLine("An attempt to divide by 0 was detected."); }
میتوانید از یک نوع استثناء مخصوص به یک خطا در داخل بلوک catch استفاده کنید، مثلاً برای خطای تقسیم عدد بر صفر از DivideByZeroException به شکل زیر استفاده کنید :
try { result = x / y; //ERROR } catch (DivideByZeroException) { Console.WriteLine("An attempt to divide by 0 was detected."); }
همچنین میتوانید اطلاعات مربوط به یک استثنا را در داخل یک متغیر قرار داده و سپس آن را نمایش دهید:
try { result = x / y; //ERROR } catch (DivideByZeroException error) { Console.WriteLine(error.Message); }
Attempted to divide by zero.
در کد بالا یک نمونه از کلاس DivideByZeroException را ایجاد کردهایم (error). این کلاس دارای یک خاصیت به نام Message است که از آن برای نمایش اطلاعاتی در مورد استثناء استفاده میکنیم. همه کلاسهای استثناء توضیحاتی در مورد خطاها میدهند. در درسهای آینده در مورد خصوصیات استثناءها بیشتر توضیح میدهیم. اگر فکر میکنید که در بلوک try ممکن است با چندین خطا مواجه شوید میتوانید از چندین بلوک catch استفاده نمایید ولی به یاد داشته باشید که برای هر کدام از آن خطاها از کلاس استثناء مربوط به هر یک استفاده کنید.
int result; int x = 5; int y; try { y = Int32.Parse(Console.ReadLine()); result = x / y; } catch (DivideByZeroException error) { Console.WriteLine(error.Message); } catch (FormatException error) { Console.WriteLine(error.Message); }
از انجاییکه مقدار y به وسیله ورودی که از کاربر گرفته میشود، تعیین میشود، مقدار آن باید با توجه به مثال بالا غیر صفر باشد (عدد تقسیم بر صفر تعریف نشده است). اما یک مشکل وجود دارد. چون ممکن است که کاربر یک مقدار غیر عددی وارد کند (مثلاً یک حرف) که در این صورت برنامه نمیتواند حرف را به عدد تبدیل کند و خطای نوع (FormatException) اتفاق می افتد. وقتی استثناء اتفاق افتاد بلوک catch مربوط به این خطا اجرا میشود و محاسبه خارج قسمت تقسیم x بر y نادیده گرفته میشود. حال فرض کنید شما میخواهید تمام خطاهای احتمالی که ممکن است در داخل بلوک try اتفاق می افتند را فهمیده و اداره کنید این کار چگونه امکانپذیر است؟ به راحتی و با استفاده از کلاس عمومی Exception میتوانید این کار را انجام داد. هر کلاس استثناء در دات نت از این کلاس ارث بری میکند بنابراین شما میتوانید هر نوع استثناءیی را در شئی از کلاس Exception ذخیره نمایید.
try { //Put your codes to test here } catch (Exception error) { Console.WriteLine(error.Message); }
با استفاده از این روش دیگر لازم نیست نگران اتفاق خطاهای احتمالی باشید چون بلوک catch برای هر گونه خطایی که در داخل بلوک try تشخیص داده شود پیغام مناسبی نشان میدهد. به این نکته توجه کنید که اگر بخواهید از کلاس پایه Exception همراه با سایر کلاسهای استثناء دیگر که از آن مشتق میشوند در برنامه استفاده کنید باید کلاس پایه Exception در آخرین بلوک catch قرار گیرد.
try { //Put your codes to test here } catch (DivideByZeroException) { Console.WriteLine("Division by zero is not allowed."); } catch (FormatException) { Console.WriteLine("Error on converting the data to proper type."); } catch (Exception) { Console.WriteLine("An error occured."); }
اگر کلاس پایه Exception را در اولین بلوک catch قرار دهیم و خطایی در برنامه رخ دهد چون تمام کلاسهای استثناء از این کلاس مشتق میشوند در نتیجه اولین بلوک catch اجرا شده و سایر بلوکها حتی با وجود اینکه خطای مورد نظر به آنها مربوط باشد اجرا نمیشوند. شما میتوانید از عمگر is نیز به صورت زیر استفاده نمایید.
try { } catch(Exception error) { if (error is DivideByZeroException) { Console.WriteLine("Cannot divide by zero!"); } if (error is FormatException) { Console.WriteLine("Format cannot be accepted!"); } }
بلوک catch از کلاس Exception برای به دام انداختن همه استثناءهایی که به وسیله برنامه به وجود میآید استفاده میکند. در داخل بلوک catch میتوانید با استفاده از یک دستور if و کلمه کلیدی is نوع استثناء به وجود آمده را بیابید.
سلام من چند خط برنامه نوشتم و چندتا متغیر از نوع string دارم و این 1 عدد متغیر از نوع int وقتی میخوام یک شی جدید از همون متغیر int بنویسم قبول نمیکنه.
Console.Write(“\tEnter your Name: “);
string adminName = Console.ReadLine();
Console.Write(“\tEnter your Family: “);
string adminFamily = Console.ReadLine();
int adminAge;
try
{
Console.Write(“\tEnter your Age: “);
adminAge = Convert.ToInt32(Console.ReadLine());
}
catch (Exception ex)
{
Console.WriteLine(“warning!!! just age”, ex);
}
…
…
Admin admin = new Admin(adminName, adminFamily, adminAge);
اینجا name و family رو قبول میکنه ولی adminage رو نه
سلام، کدتون رو کامل بذارین، شما کلاس Admin رو کجا تعریف کردین؟ هدف از این کد چیه؟