آموزش سی شارپ - قسمت بيست و چهارم
كنترل خطاها در سي شارپ - Exception Handling in CSharp
همانطور که می بینید من خطوطی از کد که احتمال خطا دارد را داخل بلاک try قرار دادم و عکس العمل خودم در موقع بروز خطا را نیز در بلاک catch. در واقع در صورتیکه در هر یک از خطوط داخل block try دچار خطا شویم به قسمت catch ارجاع داده خواهیم شد و می توانیم آنجا عکس العمل لازمه را نشان دهیم.
در سی شارپ و در namespace ی به نام System یک کلاس به نام Exception وجود دارد که در حقیقت base classی برای تمام انواع خطا ها در سی شارپ می باشد. به این معنا که تمامی خطاهایی که در سی شارپ وجود دارند از Exception به ارث رفته اند و در نتیجه تمامی آنها به نوع Exception می باشند. برای اینکه بتونین لیست Exception ها را ببینین کافیه که از منوی Debug گزینه Exception را کلیک کنین تا لیست Exception ها را به تفکیک namespace ملاحظه بفرمائید. (می تونین از Alt + Ctrl + E به عنوان Shortcut استفاده کنین).

با توجه به مثال اولی که نوشتیم تا اینجا ما توانستیم در مواقعی که احتمال وقوع خطا وجود دارد با استفاده از try و Catch مانع از بسته شدن نرم افزارمان یا به اصطلاح crash شدن آن شویم. مرحله بعدی تشخیص دادن نوع خطا و در نهایت نشان دادن عکس العمل مناسب در مقابل خطای مورد نظر است.
تولید خطا در سی شارپ
اما قبلا از اینکه به این موارد بپردازیم اجازه بدین بررسی کنیم که در سی شارپ چطور می توانیم تولید خطا کنیم؟
برای ایجاد یک خطا در زمان runtime در سی شارپ کافی است که یک شیء از جنس Exception را بوسیله کلمه کلیدی throw پرتاب کنیم. به مثال زیر دقت کنین:

در نتیجه کد بالا که در واقع تولید یک خطا را نمایش می دهد خطای زیر از نرم افزار ایجاد شده و نرم افزار بسته خواهد شد:

در واقع وقتی شما با یک خطا برخورد می کنید به این معنی است که یک شیء از جنس Exception یا کلاس هایی که از Exception به ارث رفته اند توسط کلمه کلیدی throw پرتاب شده است. حالا اگر شما از block های try , catch استفاده کنین می توانین در مقابل آن خطا عکس العمل نشان دهید:

در تصویر بالا من هنگام پرتاب کردن خطا یک متن را به عنوان توضیح خطا در سازنده کلاس Exception قرار داده ام که این متن را بعد ها از طریق متغییر Message می توانم به دست بیاورم. اما نکته ای که وجود دارد این است که برای اینکه بتوانید متن خطا و محل آن را به دست بیاورید به آن شیء ای که پرتاب شده است نیاز دارید. پس من با این یک متغییر به آن شیء دسترسی پیدا می کنم:
همانطور که می بینین متنی که در شیء پرتاب شده اعلام شده است در داخل متغییر Message در شیء ex قرار گرفته است و من می توانم آن را نمایش دهم.
همچنین شما می توانین از طریق متغییر StackTrace کلاس Exception مسیر اتقاقات رخ داده تا زمان بروز خطا را در غالب یک رشته داشته باشین:

ادامه دارد...
در تمامي زبان هاي برنامه نويسي روش هايي براي مقابله با خطا ها وجود دارد. عموما خطا ها را از ديد زمان وقوع به دو دسته Compile Time Errors و RunTime Error ها تقسيم كرد. خطا هاي گروه اول يا همان خطاهاي زمان كامپايل توسط Compiler تشخيص داده و به كاربر نمايش داده مي شوند. خطاهايي از قبيل استفاده از يك متغييري كه مقدار دهي نشده است يا اشتباه در Syntax و ....
خطاهاي زمان اجرا عموما خطاهايي هستند كه در زمان كامپايل توسط Compiler تشخيص داده نشده اند و در زمان اجراي نرم افزار بروز مي كنند. خطاهایی مثل مشکل در اتصال به بانک اطلاعاتی , ورود اطلاعات اشتباه توسط کاربر , عدم دسترسی به فایل مورد نظر و ....
اصولا هر برنامه نویس در هنگام نوشتن خطوط کد خود می تواند احتمال وقوع خطا را پیش بینی کند مثلا در مثال زیر من از کاربر انتظار دارم تا یک عدد را برای من تایپ کند:

اما می توانم حدس بزنم که کاربر می تواند به جای 10 کلمه "ALI" را سهوا یا عمدا تایپ نماید. که در این صورت نرم افزار من دچار اشکال شده و از برنامه خارج خواهد شد.
در سی شارپ برای اینکه بتوانیم خطا ها را کنترل کنیم , خطوطی را که احتمال وقوع خطا در آن ها زیاد است را در try catch می نویسیم.
برای اینکار کافی است که به صورت زیر عمل کنیم:

اصولا هر برنامه نویس در هنگام نوشتن خطوط کد خود می تواند احتمال وقوع خطا را پیش بینی کند مثلا در مثال زیر من از کاربر انتظار دارم تا یک عدد را برای من تایپ کند:

اما می توانم حدس بزنم که کاربر می تواند به جای 10 کلمه "ALI" را سهوا یا عمدا تایپ نماید. که در این صورت نرم افزار من دچار اشکال شده و از برنامه خارج خواهد شد.
در سی شارپ برای اینکه بتوانیم خطا ها را کنترل کنیم , خطوطی را که احتمال وقوع خطا در آن ها زیاد است را در try catch می نویسیم.
برای اینکار کافی است که به صورت زیر عمل کنیم:

همانطور که می بینید من خطوطی از کد که احتمال خطا دارد را داخل بلاک try قرار دادم و عکس العمل خودم در موقع بروز خطا را نیز در بلاک catch. در واقع در صورتیکه در هر یک از خطوط داخل block try دچار خطا شویم به قسمت catch ارجاع داده خواهیم شد و می توانیم آنجا عکس العمل لازمه را نشان دهیم.
در سی شارپ و در namespace ی به نام System یک کلاس به نام Exception وجود دارد که در حقیقت base classی برای تمام انواع خطا ها در سی شارپ می باشد. به این معنا که تمامی خطاهایی که در سی شارپ وجود دارند از Exception به ارث رفته اند و در نتیجه تمامی آنها به نوع Exception می باشند. برای اینکه بتونین لیست Exception ها را ببینین کافیه که از منوی Debug گزینه Exception را کلیک کنین تا لیست Exception ها را به تفکیک namespace ملاحظه بفرمائید. (می تونین از Alt + Ctrl + E به عنوان Shortcut استفاده کنین).

با توجه به مثال اولی که نوشتیم تا اینجا ما توانستیم در مواقعی که احتمال وقوع خطا وجود دارد با استفاده از try و Catch مانع از بسته شدن نرم افزارمان یا به اصطلاح crash شدن آن شویم. مرحله بعدی تشخیص دادن نوع خطا و در نهایت نشان دادن عکس العمل مناسب در مقابل خطای مورد نظر است.
تولید خطا در سی شارپ
اما قبلا از اینکه به این موارد بپردازیم اجازه بدین بررسی کنیم که در سی شارپ چطور می توانیم تولید خطا کنیم؟
برای ایجاد یک خطا در زمان runtime در سی شارپ کافی است که یک شیء از جنس Exception را بوسیله کلمه کلیدی throw پرتاب کنیم. به مثال زیر دقت کنین:

در نتیجه کد بالا که در واقع تولید یک خطا را نمایش می دهد خطای زیر از نرم افزار ایجاد شده و نرم افزار بسته خواهد شد:

در واقع وقتی شما با یک خطا برخورد می کنید به این معنی است که یک شیء از جنس Exception یا کلاس هایی که از Exception به ارث رفته اند توسط کلمه کلیدی throw پرتاب شده است. حالا اگر شما از block های try , catch استفاده کنین می توانین در مقابل آن خطا عکس العمل نشان دهید:

در تصویر بالا من هنگام پرتاب کردن خطا یک متن را به عنوان توضیح خطا در سازنده کلاس Exception قرار داده ام که این متن را بعد ها از طریق متغییر Message می توانم به دست بیاورم. اما نکته ای که وجود دارد این است که برای اینکه بتوانید متن خطا و محل آن را به دست بیاورید به آن شیء ای که پرتاب شده است نیاز دارید. پس من با این یک متغییر به آن شیء دسترسی پیدا می کنم:
همانطور که می بینین متنی که در شیء پرتاب شده اعلام شده است در داخل متغییر Message در شیء ex قرار گرفته است و من می توانم آن را نمایش دهم.
همچنین شما می توانین از طریق متغییر StackTrace کلاس Exception مسیر اتقاقات رخ داده تا زمان بروز خطا را در غالب یک رشته داشته باشین:

ادامه دارد...
+ نوشته شده در شنبه چهارم خرداد ۱۳۸۷ ساعت 14:28 توسط مسعود طباطبايي | MasoudTB
|