PDA

View Full Version : سوال در زمینه مدیریت خطاها



amirferdowsi
شنبه 14 دی 1387, 19:59 عصر
سلام
من در پروژه ای که در حال انجام اون هستم ، از معماری سه لایه استفاده می کنم و در آن ، لایه DAL و BLL رو به صورت DLL به پروژه اضافه کردم .
حالا میخوام که خطاهایی که در هر سه لایه رخ میده در یک فایل XML با ذکر تاریخ و ساعت ثبت بشه و کاربر به صفحه ای که در آن عنوان خطای ایجاد شده نمایش داده میشود ، فرستاده شود . این صفحه ثابت است و میخوام که شماره و عنوان خطای ایجاد شده به اون ارسال شده و پیغام مناسب نمایش داده شود .
لازم به ذکر است که من در برنامه خطاها رو با Try , Catch کنترل میکنم .
حالا سوال من اینه که کد ثبت خطا و ارجاع کاربر به صفحه مورد نظر رو باید در کجا قرار بدم ؟
اینم بگم که چندین بار سرچ کردم ولی مطلب مفیدی در این زمینه پیدا نکردم .

mahdi_farhani
شنبه 14 دی 1387, 20:49 عصر
یک متد بنویس که کار Log گیری رو برات انجام بده و چون داری از Try/Catch استفاده میکنی پس باید در Catch قبل از Handel کردن خطا متد Log را صدا بزنی و اطلاعات را در فایل XML ثبت کنی . برای اطمینان از مواردی که خطای Handel نشده بت میده میتونی تو Global متد Log رو صدا بزنی .
برای ارجاع کاربر ، همه خطا ها نباید به جایی دیگه ارجاع داده بشه ، بلکه باید یکسری از خطا ها کنترل شود ( مثلاً طرف به جای عدد ، حرف وارد کرده این دیگه نباید به صفحه دیگه بره، یا در زمان درج یک رکورد خطایی مثلا تکراری بودن کلید رخ میده این هم نباید به جایی دیگه بره ) تنها خطاهایی باید به صفحه دیگر ارجاع داده بشن که هندل نشده باشند . مثلاً پیدا نکردن صفحه مورد نظر ، یا وارد کردن XSS و.... که اونو با CustomError میتونی مدیریت کنی

amirferdowsi
یک شنبه 15 دی 1387, 01:11 صبح
یک متد بنویس که کار Log گیری رو برات انجام بده و چون داری از Try/Catch استفاده میکنی پس باید در Catch قبل از Handel کردن خطا متد Log را صدا بزنی و اطلاعات را در فایل XML ثبت کنی .

میتونید یک مثال یا نمونه ای معرفی کنید یا در اینجا قرار بدید ؟ :چشمک:



برای اطمینان از مواردی که خطای Handel نشده بت میده میتونی تو Global متد Log رو صدا بزنی .

اگر از Global استفاده کنم ، خطاهایی که در DLL و در لایه های DAL و BLL ایجاد میشه رو میتونم Handel کنم ؟



مثلاً پیدا نکردن صفحه مورد نظر ، یا وارد کردن XSS و.... که اونو با CustomError میتونی مدیریت کنی

حالا اگر خطا از نبود بانک اطلاعاتی یا عدم ارتباط با بانک باشه چی ؟

mahdi_farhani
یک شنبه 15 دی 1387, 01:34 صبح
1-رایت کردن یک فایل XML با ساختار مشخص که دیگه کاری نداره ........ بعد از هر Catch این متد باید صدا زده بشه.
2-بستگی داره که اونجا هندل شده باشه یا نه
3-اگر هم تنونتست به بانک وصل بشه به این صفحه میره ، چون یک خطای هندل نشده داره

amirferdowsi
پنج شنبه 26 دی 1387, 13:37 عصر
سلام
دوست عزیز از راهنماییتون ممنونم
یک سوال دیگه : اگه بخوام موقع رخ دادن یک خطای هندل شده ، بعد از ثبت خطا در فایل XML برنامه متوقف شده و به یک صفحه خطای سفارشی فرستاده بشه ، باید چیکار کنم ؟

adonis
پنج شنبه 26 دی 1387, 15:46 عصر
توي web.config اينو بنويس:

<customErrors mode="Off" defaultRedirect="error.html" />

amirferdowsi
پنج شنبه 26 دی 1387, 21:10 عصر
توي web.config اينو بنويس:

<customErrors mode="Off" defaultRedirect="error.html" />

سلام
دوست عزیز از راهنماییتون ممنونم ، ولی این تنظیمات برای زمانی که خطاها هندل(try ... Catch) نشده باشه .

adonis
پنج شنبه 26 دی 1387, 21:38 عصر
پس چه سوال عجيبي پرسيدين! خوب همون جا كه دارين اطلاعات رو ميريزين توي xml ته كد يه redirect بذارين. يا بازم من نگرفتم؟

adonis
پنج شنبه 26 دی 1387, 21:50 عصر
من الان امتحان كردم چه از try-catch استفاده بكني چه نكني اگه برنامه error بده Application_Error فراخواني ميشه. اينو بذار توي global.asax:


protected void Application_Error(object sender, EventArgs e)
{

StringBuilder message = new StringBuilder();
if (Server != null)
{
Exception exc;
for (exc = Server.GetLastError(); exc != null; exc = exc.InnerException)
{
message.AppendFormat("{0}: {1}{2}",
exc.GetType().FullName,
exc.Message,
exc.StackTrace);
}
//write message in xml
}
}

يعني ديگه توي هر catch نميخواد توي xml بنويسي. براي اون قضيه redirect هم كه گفتم ته همين catch بذارش

amirferdowsi
پنج شنبه 26 دی 1387, 23:40 عصر
پس چه سوال عجيبي پرسيدين! خوب همون جا كه دارين اطلاعات رو ميريزين توي xml ته كد يه redirect بذارين. يا بازم من نگرفتم؟
سلام
ببخشید من باید کامل تر توضیح میدادم ،
من دارم برای مدیریت خطاها یک کلاس مینویسم که برای تمامی برنامه ها بتونم ازش استفاده کنم . با این شکل نمیشه که توی همون کلاس ridirect بذارم چون ممکنه که از این کلاس در برنامه های ویندوزی هم استفاده بشه .



من الان امتحان كردم چه از try-catch استفاده بكني چه نكني اگه برنامه error بده Application_Error فراخواني ميشه

رویداد Application_Error زمانی اجرا میشه که یک خطای هندل نشده بوجود بیاد ، در غیراینصورت پس چه احتیاجی به try ... Catch و هندل کردن خطاها بود !؟

در آخر هم از توجه و راهنماییتون ممنونم .

mahdi_farhani
جمعه 27 دی 1387, 12:21 عصر
به اون متدی که فایل Log را ایجاد میکند یک پارمتر اضافه کن که یا نام صفحه که قرار است بعد از خطا منتقل شود را بنویسید و یا فرمی که قرار است باز شود را مشخص کند (به وسیله Overloading ) .
من اینطوری رو بیشتر دوست دارم-> بدون شرح


MyCompany.Utility.Web.AddLog(...................)
MyCompany.Utility.Windows.AddLog(................. ..)

amirferdowsi
جمعه 27 دی 1387, 20:51 عصر
دوست عزیز از راهنماییتون ممنونم ، ولی میشه بیشتر توضیح بفرمائید .

حالا یک سوال دیگه:
به نظر شما اگه از MessageBox برای نمایش پیغام خطا استفاده کنم کار درستیه ؟
و توی همون پیغام ادامه یا عدم ادامه برنامه رو سوال کنم ؟

mahdi_farhani
جمعه 27 دی 1387, 23:30 عصر
AddLog(ex.Message,"when ocure Error ,""~\showError.aspx")
AddLog(ex.Message,"when ocure Error ,""frmErrorShow")

منظورم این بود ،ولی اینو پیشنهاد نمیکنم ، همون روش قبلی که 2 فضای نام جدا در نظر بگیرید فکر کنم بهتر باشه.
شما از Messagebox در وب نمیتونید استفاده کنی(البته زمانی که پروژه به صورت FileSystem باز شود میتوانید ) ،پس بیخیال Messagebox بشید .