دستورات 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.

متغیر دارای اطلاعات مفیدی در مورد استثناء به وجود آمده است. برای نمایش اطلاعاتی در مورد استثناء هم از خاصیت 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 نوع استثناء به وجود آمده را بیابید.

لطفا اگر نظر، پیشنهاد و یا انتقادی در باره مطلب بالا دارید در قسمت زیر و اگر سوالی دارید در بخش پرسش و پاسخ مطرح بفرمایید.

  1. محمد پاسخ دادن

    عالی هستید واقعا ممنون نننننننننننننننننننننننننننننننننن از ته دل میگم دمتون گرم

  2. h_kh پاسخ دادن

    ممنون خیلی عالی هست.

  3. yaser پاسخ دادن

    سلام،مهندس شرمنده من تحقیق در مورد ارورهای درایو Cمیخواستم پیدا نشد منو راهنمایی نمی کنید؟

    • یونس ابراهیمی پاسخ دادن

      سلام دوست عزیز
      منظورتون از ارورهای درایو C چیه؟ میشه بیشتر توضیح بدین؟

  4. Heydar.albsh پاسخ دادن

    عالی عالی خیلی قشنگ بود یاد گرفتم

  5. fatemeh پاسخ دادن

    خیلی عالی بود اصلا کم نظیر چیه بی نظیر بود ^ـــ^

    • یونس ابراهیمی پاسخ دادن

      بسیار ممنون، لطف دارین

  6. سینا زارع پاسخ دادن

    سلام

    ممنون دمتون گرم

  7. Habiballahafg پاسخ دادن

    با سلام و خسته نباشید مباجث خیلی جامع و کامل هست و تشکر میکنم ازتون
    ولی من یه سوال داشتم در صورتی که از این try, catch استفاده کنیم و قسمت try با مشکل مواجه بشه و کد قسمت catch اجرا بشه و این هم مشکل بخوره اون وقت تکلیف چیه؟
    ممکنه سوالم یه مقدار احمقانه به نظر برسه ولی جوابش رو دوست دارم.
    ممنون

    • یونس ابراهیمی پاسخ دادن

      سلام، سوالتون کاملا به جاست، جواب شما تو درس بعده