PDA

View Full Version : نکاتی در مورد Exception Handling....



رها
شنبه 13 بهمن 1386, 15:54 عصر
سلام
این تاپیک رو به این منظور ایجاد کردم که تجربیات خودم رو در مورد Exception Handling منتقل کنم
البته از دوستان دیگر هم تقاضا دارم تجربیات خودشون رو در همین تاپیک قرار بدن تا به امید خدا یه تاپیک مفصل و جامع در مورد این مبحث ایجاد بشه...

در اولین قدم من به سرغ خطاهایی می رم که به هر دلیل از دست برنامه نویس فرار می کنند. همونجوری که می دونید ما به کمک بلوک try ،کدهامون رو جوری می نویسم که در صورت ایجاد خطا ، در قسمت except اونها رو مدیریت کنیم و پیام مناسبی رو به کاربر برنامه بدیم
اما خوب به هردلیل ممکنه این بلوک توسط برنامه نویس در یک قسمت ایجاد نشه و باز همونطوری که می دونید در صورت بروز خطا در اون قطعه کد، دات نت فریم ورک با نمایش پیام، بروز خطا رو نشون می ده.
برای جلوگیری از این نمونه خطاها که به Unhandled Exception معروف هستند من راهکار زیر رو به کار بردم.
مراحل زیر رو برای به دام انداختن اینگونه خطاها طی کنید :

در فایل program.cs مربوط به پروژه بعد از دستورات زیر


Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
دستور زیر رو قرار بدید


Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadExce ption);
و در همون فایل program.cs متدی با همان نامی که در سازنده بالا دادید باید ایجاد کنید مثل متد زیر


static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
MessageBox.Show("خطا در اجرای دستور کاربر", "خطا");
}

از این به بعد در صورتی که خطایی در قطعه کدی از برنامه رخ بده که درون بلوک try قرار نداشته باشه به این متد فرستاده می شه و دیگه پیام پیش فرض دات نت فریم ورک نمایش داده نمی شه.
نکته : آرگومان e در متد فوق حاوی Exception ایجاد شده می باشد که از آن می توان استفاده های مختلفی کرد.
این از اولین قدم.
در ادامه این مبحث می توان به مباحثی مثل log کردن خطاها، نمایش توضیحات مربوط به خطای ایجاد شده و ارسال پیام کامل خطا به ایمیل برنامه نویس پرداخت که خواهش می کنم دوستان آموخته هاشون در این موارد یا هر بحث مفید دیگه ارائه بدهند.

رها
یک شنبه 14 بهمن 1386, 18:24 عصر
سلام
شاید واستون پیش اومده باشه که کاربر نرم افزارتون، باهاتون تماس بگیره و بگه که نرم افزار چند روز قبل یه خطای عجیب غریب داد و بعدش هم بهتون بگه که اصلاً یادش نمی یاد که در چه حالتی این خطا اتفاق افتاد.
من برای رفع مشکلات از دست در رفته، از سیستم log کردن خطاهای برنامه استفاده می کنم
این کار چندین حسن داره
اول اینکه دیگه نیازی نیست به کاربر التماس کرد که بابا تو رو خدا بگو توی کدوم فرم یا در چه مرحله ای خطا رخ داد
دوم اینکه با استفاده از روش توضیح داده شده در پست قبل بعد از به دام انداختن خطاهای از دست دررفته ،می توان اطلاعاتی در مورد اونها ذخیره کرد تا به موقع به حسابشون رسید
سوم به طور آماری مشخص می شه که برنامه چقدر پایداره

من برای اینکار از یک کلاس static استفاده می کنم که متدی برای ذخیره کردن اطلاعات Exception ایجاد شده در فایلهای xml و txt داره.
یه نمونه پروژه کوچولو که طرز استفاده از این کلاس رو نشون می ده به این پست Attatch کردم

نکته : بعضی وقتها نباید تمام اطلاعات مربوط به خطای ایجاد شده در فایل ذخیره کرد به خصوص اگر در خطا اطلاعات امنیتی وجود داشته باشه یا خطر وجود رقیب و ... وجود داشته باشه.

saed2006
جمعه 10 اردیبهشت 1389, 23:49 عصر
سلام
این تاپیک رو به این منظور ایجاد کردم که تجربیات خودم رو در مورد Exception Handling منتقل کنم
البته از دوستان دیگر هم تقاضا دارم تجربیات خودشون رو در همین تاپیک قرار بدن تا به امید خدا یه تاپیک مفصل و جامع در مورد این مبحث ایجاد بشه...

در اولین قدم من به سرغ خطاهایی می رم که به هر دلیل از دست برنامه نویس فرار می کنند. همونجوری که می دونید ما به کمک بلوک try ،کدهامون رو جوری می نویسم که در صورت ایجاد خطا ، در قسمت except اونها رو مدیریت کنیم و پیام مناسبی رو به کاربر برنامه بدیم
اما خوب به هردلیل ممکنه این بلوک توسط برنامه نویس در یک قسمت ایجاد نشه و باز همونطوری که می دونید در صورت بروز خطا در اون قطعه کد، دات نت فریم ورک با نمایش پیام، بروز خطا رو نشون می ده.
برای جلوگیری از این نمونه خطاها که به Unhandled Exception معروف هستند من راهکار زیر رو به کار بردم.
مراحل زیر رو برای به دام انداختن اینگونه خطاها طی کنید :

در فایل program.cs مربوط به پروژه بعد از دستورات زیر


Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
دستور زیر رو قرار بدید


Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadExce ption);
و در همون فایل program.cs متدی با همان نامی که در سازنده بالا دادید باید ایجاد کنید مثل متد زیر


static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
MessageBox.Show("خطا در اجرای دستور کاربر", "خطا");
}

از این به بعد در صورتی که خطایی در قطعه کدی از برنامه رخ بده که درون بلوک try قرار نداشته باشه به این متد فرستاده می شه و دیگه پیام پیش فرض دات نت فریم ورک نمایش داده نمی شه.
نکته : آرگومان e در متد فوق حاوی Exception ایجاد شده می باشد که از آن می توان استفاده های مختلفی کرد.
این از اولین قدم.
در ادامه این مبحث می توان به مباحثی مثل log کردن خطاها، نمایش توضیحات مربوط به خطای ایجاد شده و ارسال پیام کامل خطا به ایمیل برنامه نویس پرداخت که خواهش می کنم دوستان آموخته هاشون در این موارد یا هر بحث مفید دیگه ارائه بدهند.


من دقیقا همین کار رو میکنم اما باز خطا ها توسط خود vs نمایش داده میشه
منظور شما خطای پروژه نصب شده روی سیستم کاربر هست یا وقتی داریم برنامه رو تکمیل میکنیم هم مدیریت خطا توسط این متدی که گفتین اجرا میشه؟

alvandlinux
دوشنبه 11 دی 1391, 13:44 عصر
سلام سعید جان
وقتی برنامه رو از توی ویژوال استودیو run میکنی معلومه که باید ارور خوده ویژوال بالا بیاد. چون تو از دید ویژوال استودیو برنامه نویسی و نه کاربر. اگه شما بری از داخل ویندوز فایل اجرایی رو باز کنی پیغام رو می بینی

plus
دوشنبه 11 دی 1391, 13:54 عصر
من دقیقا همین کار رو میکنم اما باز خطا ها توسط خود vs نمایش داده میشه
منظور شما خطای پروژه نصب شده روی سیستم کاربر هست یا وقتی داریم برنامه رو تکمیل میکنیم هم مدیریت خطا توسط این متدی که گفتین اجرا میشه؟

میتونین Mode رو از حالت Automatic به Catch تغییر بدین تا همیشه هندل بشه:

Application.SetUnhandledExceptionMode(UnhandledExc eptionMode.CatchException);