پراپرتی Message
نام دوره: زبان سی شارپ مقدماتی
نویسنده: علی مقدم جاه (مدرس دوره)
پراپرتی Message چیست؟دستور شرطی try catch
یکی از مهمترین مباحث هر زبان برنامهنویسی، نحوه برخورد با خطاها و استثنایی است که در هنگام اجرا برنامه رخ میدهند.
فرض کنید که برنامهای را توسعه و به کارفرما خود تحویل دادهاید، پس قطعا به تمامی مواردی که ممکن است رخ دهد هم فکر کرده و آنها را با استفاده از دستوراتی مثل if و else if و else و while و TryParse و امثالهم کنترل کردهاید.
مثلا به این فکر کردهاید که اگر کاربر به جای کد ملی ۱۰ رقمی، نام و نام خانوادگی خود را وارد کرد، سیستم چه پیغامی به او نمایش دهد.
اما جالب است بدانید که در ۹۹% پروژههای کاربردی، باوجود آنکه برنامهنویس تاکید بر بدون باگ بودن برنامه دارد، اما باز هم در زمان اجرا و در محیطهای عملیاتی، استثناهایی رخ میدهد که شما به آن فکر نکرده و درنتیجه آن را کنترل نکردهاید.
به طور کلی در برنامهها ممکن است دو نوع اتفاق رخ دهد:
۱. ارور یا همان باگ:
که از دست برنامهنویس هیچ کاری بر نمیاد! به عنوان مثال یهو برق سرور قطع میشه!
۲. استثنا (مواردی که به آن فکر نشده)
مثلا یک قطعه کدی را نوشتهایم که از سرور تصویر یک مقاله را واکشی کند، اما درنظر نگرفتیم که اگه اون تصویر از طریق پنل ادمین یا هرجای دیگری پاک شده باشد، سیستم زمانی که نمیتواند در دیتابیس آن را پیدا کند، چه اتفاقی رخ دهد!
اما مسئله دومی که ممکن است با رخ دادن استثناها اتفاق بیافتد، این است که احتمال لو رفتن کدهای برنامه شما وجود داشته که در اینصورت هلو را درون دهن هکرها (حتی هکرهای ناشی) قرار دادهاید.
جالب است بدانید که اکثر هکرها دقیقا همین کار را میکنند! یعنی تلاش میکنند تا در برنامه شما خطا ایجاد کنند تا سیستم ناخواسته کدهای شما را به نمایش بگذارد!
باتوجه به توضیحات بالا، رفته رفته مثل کلاس Exception در زبان سیشارپ، تمامی زبانها نیز کلاسی را برای خود تعریف کردند تا قابلیت کنترل خطاها و استثناها را به برنامهنویس ارائه دهد.
درنتیجه در زبان برنامهنویسی سیشارپ میتوانیم با استفاده از کلاس Exception، تا حد زیادی از بروز این استثناها جلوگیری کنیم.
کلاس Exception شامل کلی کلاس فرزند و متدهای فراوانی است که هرکدام از آنها برای جلوگیری از بروز یک استثنا بوجود آمدهاند، اما ما در این دسته بندی برای درک بهتر شما عزیزان، تنها ۴ کلاس فرزند از کلاس والد Exception را توضیح میدهیم:
۱. DivideByZeroException : خطای تقسیم یک عدد بر صفر
۲. NullReferenceException : خطای ارجاع مقدار null
۳. FormatException : خطای ورود نامعتبر مقدار
۴. IndexOutOfRangeException : خطای شماره index
برای جلوگیری از بروز خطا، باید از دستور کنترلی try catch استفاده کنید.
این دستور به طور کلی شامل سه بخش زیر است:
۱. بلاک try
۲.بلاک catch
۳.بلاک finally
ساختار کلی این دستور شرطی به شکل زیر است:try { } catch(Exception ex) { } finally { }
هر زمان که احساس کردید ممکن است کدی از شما دچار بروز خطا یا احتمالا استثناهای برنامه شود، آن کد را درون بلاک try بنویسید.
سیستم تلاش میکند تا کدهای داخل محدوده بلاک try را اجرا کند؛ اگر این کدها بدون مشکلی اجرا شوند که هیچ، اما اگر خطایی رخ دهد، سیستم به جای نمایش خطا یا نمایش شماره خط و کدی که دچار خطا شده به کاربر، مستقیما کدهای داخل محدوده بلاک catch را اجرا میکند.
نکته: پس کدهای داخل بلاک catch زمانی اجرا خواهند شد، که اجرا کدهای داخل محدوده بلاک try دچار خطایی شده باشند.
در محدوده بلاک Catch میتوانید هر دستوری که نیاز داشتید بنویسید، اما ما با استفاده از کلاس Exception یک شئ به نام ex تعریف کرده ایم، تا توسط پراپرتی Message بتوانیم شرح خطا را بدون نمایش کدهای برنامهنویسی مشاهده کنیم.
به مثال زیر دقت کنید:
try
{
Console.Write("Enter number 1 : ");
int num1 = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter number 2 : ");
int num2 = Convert.ToInt32(Console.ReadLine());
float avg = num1 / num2;
Console.WriteLine($"Avg is: {avg}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
همانطور که در قطعه کد بالا مشاهده میکنید، ما قسمتی از کدهای خود را که احتمال بروز خطا یا استثنا داشتند، درون محدوده بلاک try قرار دادهایم، اینکار یعنی داریم به سیستم میفهمانیم که تلاش کن این کدها را اجرا کنی، اگر توانستی کدها را اجرا کنی که چه خوب و بیخیال کدهای داخل بلاک Catch بشو، اما اگر کدهای داخل بلاک try به مشکلی برخوردند و تو نتوانستی آنها را اجرا کنی، درنتیجه کدهای داخل بلاک catch را اجرا کن.
همچنین در محدوده بلاک catch، به عنوان ورودی متد WriteLine، پراپرتی Message را توسط شئ ex فراخوانی کردیم.
این پراپرتی، توانایی چاپ علت ارور بوجود آمده را به شکل مناسب و بدون نمایش (لو رفتن) کدهای برنامهنویسی به کاربران را دارد.
شئ ex از کلاس پشت سر خود یعنی Exception تعریف شده که باید حتما در پرانتز Catch نوشته شود.
درنتیجه درصورت عدم وجود خطا، تنها کدهای داخل بلاک try اجرا میشوند، اما اگر اجرای کدهای داخل بلاک try با خطایی مواجه شود، کدهای داخل بلاک catch اجرا میشوند.
در نهایت چه کدهای try بدون خطا اجرا شوند، و چه کدهای محدوده بلاک try دچار خطا شده که منجر به اجرا شدن کدهای داخل بلاک catch شود، در هر دو حالت کدهای داخل محدوده بلاک finally اجرا خواهند شد.
نکته: بلاک finally اجباری نبوده و درصورت عدم نیاز به آن میتوانید تنها از دو بلاک try catch استفاده نمایید.
استفاده از سه بلاک try catch finally بصورت همزمان کاملا بر اساس نیاز پروژه میباشد.
جهت شرکت در دورههای زبان برنامه نویسی سیشارپ، از کد تخفیف heplc30 استفاده کنید.
۲. NullReferenceException : خطای ارجاع مقدار null
۳. FormatException : خطای ورود نامعتبر مقدار
۴. IndexOutOfRangeException : خطای شماره index
۲.بلاک catch
۳.بلاک finally
try
{
Console.Write("Enter number 1 : ");
int num1 = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter number 2 : ");
int num2 = Convert.ToInt32(Console.ReadLine());
float avg = num1 / num2;
Console.WriteLine($"Avg is: {avg}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}