مدیریت استثناء در سی شارپ
مدیریت استثنا به مدیریت خطاهایی گفته میشود که در طول اجرای برنامه ممکن است رخ دهند. مثلا ممکن است در یک برنامه ماشین حساب که نوشته اید کاربر یک ورودی غیر معمول مثل تقسیم یک عدد بر صفر را وارد کند که برنامه دچار خطا شده و عملکرد غیر عادی از خود نشان میدهد. این بر عهده برنامه نویس است که همچین خطاهایی را در برنامه خود پیش بینی کرده و رخ داد آن ها را به نحو مناسب پیش بینی کند. از آنجایی که این نوع خطاها در حین توسعه و نوشتن برنامه در محیط توسعه (IDE) نشان داده نمیشود، برنامه نویس باید از روی تجربه و آزمون خطاهای مختلف همچین خطاهایی را در برنامه مدیریت کند.
مدیریت خطا در سی شارپ با کلمات کلیدی try,catch,finally و throw انجام میشود.
Try: این بلاک قسمتی از کد است که امکان بروز خطا در آن وجود دارد و در ادامه آن حتما قسمت catch قرار دارد.
Catch: این قسمت مدیریت خطا را بر عهده دارد. چنانچه در قسمت try خطایی رخ دهد، کدهای این بلاک اجرا میشوند و اگر خطایی رخ ندهد کدهای این قسمت اجرا نمیشوند.
Finally: در این بلاک کدهایی قرار میگیرند که ما میخواهیم در هر صورت که خطایی رخ دهد یا رخ ندهد اجرا شود. مثلا اگر یک فایل را میخواهید باز کنید حتما باید این فایل بسته شود، چه خطایی رخ دهد یا ندهد.
Throw: با این کلمه کلیدی هنگامی که یک خطا رخ دهد از رفتار غیر عادی برنامه و تولید خروجی نامطلوب جلوگیری کرده و کاربر متوجه رخ دادن خطا نمیشود.
قواعد مدیریت استثناء
فرض کنید در یک بلاک از کد، یک خطای استثنا رخ دهد. این خطای استثنا با ترکیبی از کلمات کلیدی try/catch مدیریت میشود. این کلمات کلیدی در اطراف کدهایی که ممکن است در طول اجرا خطایی تولید کنند قرار میگیرند. نحوه استفاده از این کلمات کلیدی و ترکیب قرار گیری آن ها به صورت زیر است :
try { // statements causing exception } catch( ExceptionName e1 ) { // error handling code } catch( ExceptionName e2 ) { // error handling code } catch( ExceptionName eN ) { // error handling code } finally { // statements to be executed }
تا اینجا با مفهوم استثنا و مدیریت آن آشنا شدیم. در ادامه با ارایه یک مثال به این مفهوم به صورت عمیق تر میپردازیم. مثال زیر نمونه ای از خطای تقسیم بر صفر را نشان میدهد:
using System; namespace ErrorHandlingApplication { class DivNumbers { int result; DivNumbers() { result = 0; } public void division(int num1, int num2) { try { result = num1 / num2; } catch (DivideByZeroException e) { Console.WriteLine("Exception caught: {0}", e); } finally { Console.WriteLine("Result: {0}", result); } } static void Main(string[] args) { DivNumbers d = new DivNumbers(); d.division(25, 0); Console.ReadKey(); } } }
خروجی این برنامه به صورت زیر است :
Exception caught: System.DivideByZeroException: Attempted to divide by zero. at ... Result: 0
در مثال بالا اگر دقت کنید، در متد main ابتدا یک شئ از کلاس divnumbers ساخته شد، سپس متد division صدا زده شد. اگر به ساختار این متد دقت کنید خواهید دید که قسمت تقسیم در بلاک try قرار گرفت، چون احتمال رخ دادن خطا در این قسمت است. در بلاک catch در صورتی که خطای تقسیم بر صفر رخ دهد، کدهای این قسمت رخ خواهد داد. عبارت نوشته شده در پرانتز مقابل catch نام کلاسی است که خطای ما از آن نوع میباشد DividedbyzeroException نام یک کلاس است. عبارت e حاوی پیامی است که در باره خطای رخ داده به کاربر توضیح میدهد. در نهایت قسمت finally که در حالتی اجرا خواهد شد.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.