PDA

View Full Version : حرفه ای: مدیریت خطا به همراه Log کلیه خطاهای پیش آمدی



Kia_MLS
سه شنبه 06 اردیبهشت 1390, 19:15 عصر
با سلام خدمت همه دوستان و اساتید محترم
همانطور که همه شما میدونید ابتدایی ترین روش برای مدیریت خطا استفاده از ساختار try ... catch ... finally است.
فرض کنید میخوایم در برناممون این امکان رو اضافه کنیم که هر خطایی در برنامه بوجود اومد، توضیحات و تاریخ رخ دادن خطا رو در یک فایل متنی ذخیره کنیم.

اگر برای مدیریت خطاهای برنامه از ساختار try ... catch ... finally استفاده کنیم، در بهترین حالت مجبوریم هرکجا که catch نوشتیم یک خط کد هم اضافه کنیم که توضیحات مربوط به خطای بوجود آمده رو ثبت کنه.

به نظر این کار منطقی میاد اما اگه پروژه بزرگ باشه و تعداد try ... catch ... finally زیاد باشه باز هم این روش مناسبه؟ :متفکر:

سوالی که من از اساتید محترم داشتم اینه:
آیا راهی هست که رخ دادن هر خطایی در برنامه رو مثل مابقی رویدادها override کنیم؟
در واقع به ساختار try ... catch ... finally مثل یک Event معمولی نگاه کنیم و کلاسی بنویسیم که رویداد catch رو Override بکنه، ابتدا دستورات دلخواه ما رو اجرا کنه و بعد سراغ دستورات نوشته شده در قسمت catch بره؟

جهت یادآوری عرض میکنم:
گزینه های OnApplicationError در فایل Global.asax و CustomError در WebConfig قابل قبول نیستند. چون در 2 فایل ذکر شده زمانی یک خطا Handle میشه که در سطوح پایین تر مدیریت نشده باشه.
به عبارت دیگه اگر در برنامه از کدهایی شبیه به این استفاده شده باشه:

try
{
int i = 100 / 50;
i -= 2;
int j = 100 / i;
}
catch
{
this.Title = "Error";
}

در این صورت رویداد OnApplicationError در Global.asax یا CustomError در WebConfig اتفاق نخواهد افتاد.

clover
چهارشنبه 07 اردیبهشت 1390, 23:42 عصر
به این لینک سری بزنید، شاید مفید باشه:
http://msdn.microsoft.com/en-us/library/bb398933.aspx

javad_mjt
پنج شنبه 08 اردیبهشت 1390, 00:09 صبح
سلام
این لینک ها رو هم ببینید امیدوارم بتونی از فیلتر رد بشی
http://www.dotnettips.info/2011/01/elmah.html
http://vahidnasiri.blogspot.com/2009/05/elmah.html
http://vahidnasiri.blogspot.com/2009/08/elmah-11.html

(http://www.dotnettips.info/2011/01/elmah.html)

Kia_MLS
یک شنبه 18 اردیبهشت 1390, 19:32 عصر
سلام
این لینک ها رو هم ببینید امیدوارم بتونی از فیلتر رد بشی
http://www.dotnettips.info/2011/01/elmah.html
http://vahidnasiri.blogspot.com/2009/05/elmah.html
http://vahidnasiri.blogspot.com/2009/08/elmah-11.html

(http://www.dotnettips.info/2011/01/elmah.html)

دوست عزیز لینکهای شما رو دیدم
جالب بود اما elmah جهت خطاهای مدیریت نشده است :ناراحت:
هرچند توضیحاتی در مورد Log کردن خطاهای مدیریت شده هم داده اما این مستلزم اضافه کردن یک خط کد به تمامی catch های برنامه است :ناراحت:

من به دنبال این هستم که کلیه خطا ها اعم از مدیریت شده و نشده Log شوند، اون هم بدون اضافه کردن کد به قسمت catch

shv3264
سه شنبه 20 اردیبهشت 1390, 17:28 عصر
می تونی از کنترل خطای ساخت نیافته استفاده کنی ، منظورم on error goto هست ، هر چند روش خوبی نیست ولی کار شما رو انجام میده

Kia_MLS
سه شنبه 20 اردیبهشت 1390, 17:43 عصر
می تونی از کنترل خطای ساخت نیافته استفاده کنی ، منظورم on error goto هست ، هر چند روش خوبی نیست ولی کار شما رو انجام میده

میشه بیشتر توضیح بدی یا یک مثال بزنی؟

shv3264
سه شنبه 20 اردیبهشت 1390, 18:15 عصر
حتما
روش try ... catch finally به روش کنترل خطای ساخت یافته معروفه . قبل از این روش از کنترل خطای ساخت نیافته استفاده می شد . در این روش دو را وجود داره ، اول روالت یا تابعت فرقی نمی کنه باد این عبارتو بنویسی :

اگه می خوای ارور نادیده گرفته بشه باید بنویسی :


on error resume next

با این کار اجرای برنامه از خط بعد از ارور ادامه داده میشه، ولی اگه می خوای موقع ارور کاری انجام بشه باید تو روالت(تابعت) منطقه تعریف کنی مثلا :



on error goto errhnl;
int i = 100 / 50;
i -= 2;
int j = 100 / i;

errhnl:
کدهای شما




با اینکار موقع ارور به بخش errhnl ارجاع داده میشه ، شما می تونید از اونجا بازهم با استفاده از goto به یک یا چند بخش دیگه ارجاع بدین




on error goto errhnl;
int i = 100 / 50;
i -= 2;
int j = 100 / i;

errhnl:
کدهای شما
if(i==0) goto zerohnl;

zerohnl:
کدهای شما

Kia_MLS
سه شنبه 20 اردیبهشت 1390, 20:04 عصر
حتما
روش try ... catch finally به روش کنترل خطای ساخت یافته معروفه . قبل از این روش از کنترل خطای ساخت نیافته استفاده می شد . در این روش دو را وجود داره ، اول روالت یا تابعت فرقی نمی کنه باد این عبارتو بنویسی :

اگه می خوای ارور نادیده گرفته بشه باید بنویسی :


on error resume next

با این کار اجرای برنامه از خط بعد از ارور ادامه داده میشه، ولی اگه می خوای موقع ارور کاری انجام بشه باید تو روالت(تابعت) منطقه تعریف کنی مثلا :



on error goto errhnl;
int i = 100 / 50;
i -= 2;
int j = 100 / i;

errhnl:
کدهای شما




با اینکار موقع ارور به بخش errhnl ارجاع داده میشه ، شما می تونید از اونجا بازهم با استفاده از goto به یک یا چند بخش دیگه ارجاع بدین




on error goto errhnl;
int i = 100 / 50;
i -= 2;
int j = 100 / i;

errhnl:
کدهای شما
if(i==0) goto zerohnl;

zerohnl:
کدهای شما


دوست عزیز من از VS 2008 و زبان سی شارپ استفاده میکنم.
همچین Syntax ی تا به حال ندیدم :متفکر:
سعی کردم چیزی شبیه به کدهای مثال شما رو تست کنم اما Syntax error میده!

تازه اگر همچین Syntax ی هم وجود داشته باشه که نسبت به try ... catch ... finally برای کاری که من میخوام انجام بدم استفاده ای نداره!

صورت مسئله اینه: کدهای درون catch و کدهای دیگه ای که من مد نظرم هست به هنگام رخ دادن هر خطایی رخ بده، البته بدون اضافه کردن هیچ خط کدی به قسمت catch
:چشمک: