PDA

View Full Version : کنترل کلی exception



AmirAlimadadi
دوشنبه 23 اردیبهشت 1387, 16:45 عصر
سلام دوستان
من می خوام توی یک windows project روی تمامی exceptionها کنترل داشته باشم به طوری که فقط یک جا از catch استفاده کنم و تمامی اطلاعات اعم از نام کاربر و سلسله مراتبی که در توابع گذرانده شده تا ایراد به وجود آمده و یا اینکه این ایراد در کدام فرم به وجود آمده رو داشته باشم ، کاری که خودم کردم به صورت زیر بود ولی جواب نداد. خواهش می کنم که اگه می دونین کمک کنین

try

}
;()InitializeComponent
{
catch

}

// در این قسمت تمامی اطلاعات رو می خوام بگیرم

{

eyes_shut_number1
دوشنبه 23 اردیبهشت 1387, 17:33 عصر
باید توش تمام شرطهایی که باعث به وجود آوردن اکسپشن شده رو چک کنی که به نظر کار سختی میاد

علیرضا مداح
دوشنبه 23 اردیبهشت 1387, 18:12 عصر
سلام دوست عزیز
به نظر میرسد شما نیاز به Automatic Exception Handling دارید ، برای اینکار میبایست فایل Program.cs را باز کرده و آن را به صورت زیر تغییر دهید :


using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;
namespace WindowsApplication50
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.ThreadException +=new System.Threading.ThreadExceptionEventHandler(Appli cation_ThreadException);
Application.Run(new Form1());
}
private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
MessageBox.Show(e.Exception.ToString());
}
}
}

Sajjad.Aghapour
دوشنبه 23 اردیبهشت 1387, 21:00 عصر
اقای مداح سلام..........
اگه بلاک catch رو به صورت زیر بنویسیم کل خطاهای موجود رو کنترل نمی کنه؟



catch (System.Exception exc)
{
....
}

mohammad272005
دوشنبه 23 اردیبهشت 1387, 21:22 عصر
بله ولي نه در كل برنامه فقط در سطح try..catchي كه توش هستيد. با اين كار فقط بعضي خطاهاي سخت‏افزاري و critical ممكنه از دستتون در بره.

AmirAlimadadi
سه شنبه 24 اردیبهشت 1387, 09:56 صبح
سلام دوست عزیز
به نظر میرسد شما نیاز به Automatic Exception Handling دارید ، برای اینکار میبایست فایل Program.cs را باز کرده و آن را به صورت زیر تغییر دهید :


using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;
namespace WindowsApplication50
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.ThreadException +=new System.Threading.ThreadExceptionEventHandler(Appli cation_ThreadException);
Application.Run(new Form1());
}
private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
MessageBox.Show(e.Exception.ToString());
}
}
}


سلام دوست عزیز
من این راهنمایی شما رو انجام دادم، ولی مشکلی که وجود داره اینه که وقتی خطایی در برنامه به وجود می یاد اول خود Net. اشکال رو پیدا می کنه و بعد از اون اگه دوباره کلید F5 رو فشار بدیم کد شما کار می کنه، ممنون می شم اگه راهنمایی کنین

علیرضا مداح
سه شنبه 24 اردیبهشت 1387, 10:14 صبح
من این راهنمایی شما رو انجام دادم، ولی مشکلی که وجود داره اینه که وقتی خطایی در برنامه به وجود می یاد اول خود Net. اشکال رو پیدا می کنه و بعد از اون اگه دوباره کلید F5 رو فشار بدیم کد شما کار می کنه، ممنون می شم اگه راهنمایی کنین
این اتفاق تنها زمانی رخ میدهد که شما در مد Debug هستید یا به عبارتی پروژه را از طریق ویژوال استادیو Run کرده اید ، اما اگر فایل EXE را جداگانه اجرا کنید ، دیگر این امر بروز نخواهد کرد .

AmirAlimadadi
یک شنبه 08 دی 1387, 10:49 صبح
سلام به همه دوستان
ممنون از راهنمایی شما، اما یه مشکلی که هست اینه که اگر توی پروژه ما در چند فرم پیش بریم(یعنی توی هر فرم از یه فرم دیگه بسازیم و اون رو صدا کنیم)، و مثلا توی مرحله 4 یه خطا روی بده، تمامی فرمها بسته می شه و تا فرم اولیه پیش می ره و بعد از اون خطا گیری می شه! من می خوام که فرم ها بسته نشن و یا دست کم یه مرحله عقب بریم.
ممنون

razavi_university
دوشنبه 09 دی 1387, 01:30 صبح
. . .
یه مشکلی که هست اینه که اگر توی پروژه ما در چند فرم پیش بریم(یعنی توی هر فرم از یه فرم دیگه بسازیم و اون رو صدا کنیم)، و مثلا توی مرحله 4 یه خطا روی بده، تمامی فرمها بسته می شه و تا فرم اولیه پیش می ره و بعد از اون خطا گیری می شه! من می خوام که فرم ها بسته نشن و یا دست کم یه مرحله عقب بریم.

دقيقا متوجه نشدم چه مشكلي پيش مياد، واسه من در هر مرحله‌اي بود همونجا خطا رو نمايش ميده

در تكميل فرمايشات جناب مداح
براي مديريت همه خطاهاي برنامه پيشنهاد مي‌كنم يك قسمت براي Log گيري داشته باشيد، يعني از تمام مشكلاتي كه در برنامه بوجود مي ايد و چيزهاي ديگري كه مد نظر هستند Log تهيه بشه
براي اينكار يك كلاس ساده Static نوشتم كه تمام خطاهاي برنامه رو توي يك فايل XML ذخيره مي‌كنه
(مزيت اينكار اينه كه اگه برنامه رو به مشتري تحويل دادين و در برنامه خطايي وجود داشت نيازي نيست كه مشتري يادش باشه توي كدوم فرم و در حين انجام چه كاري اين خطا بوجود اومده، شما با خوندن اين فايل سريعا به مشكل پي ميبرين)
فقط فايل Program.cs بايد به صورت زير تغيير كنه


static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadExce ption);
Application.Run(new Main.FrmMain());
}


static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
MessageBox.Show("در هنگام اجرای عملیات خطا رخ داده است." + "\r\n" +
"لطفاً از صحت عملیات اطمینان حاصل کنید.\n" + e.Exception.Message.ToString(), "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);

//send unhandled Erorr to save in applog
AppLog.logXmlFile(e.Exception, AppLog.AppLogType.UnHandled);
}

AmirAlimadadi
دوشنبه 09 دی 1387, 07:45 صبح
ممنون از راهنماییتون
منظور من اینه که اگه چند تا فرم رو توی همدیگه create کنیم و show کنیم، و توی لایه مثلا 4 یه مشکلی پیش بیاد، فرمهای من به ترتیب بسته می شه، چون thread رو در ابتدای اجرا شدن application ساختیم، (البته فکر می کنم).
به خاطر این برنامه log هم ممنون، فقط این کلاس می تونه محل دقیق وقوع خطا رو بگیره(چه کلاسی، چه تابعی، چه خطی و ...). فکر می کنم اصطلاحا بهش می گن call stack.

razavi_university
دوشنبه 09 دی 1387, 23:42 عصر
ممنون از راهنماییتون
منظور من اینه که اگه چند تا فرم رو توی همدیگه create کنیم و show کنیم، و توی لایه مثلا 4 یه مشکلی پیش بیاد، فرمهای من به ترتیب بسته می شه، چون thread رو در ابتدای اجرا شدن application ساختیم، (البته فکر می کنم).


ميتونين بگين شما چطوري پنجره رو در همديگه Create ميكنين؟ لطفا كد ايجاد و نمايش فرم‌هاتون رو بنويسيد؟


فقط این کلاس می تونه محل دقیق وقوع خطا رو بگیره(چه کلاسی، چه تابعی، چه خطی و ...). فکر می کنم اصطلاحا بهش می گن call stack.
خوب مگه قراره كار ديگه هم بكنه:متفکر:
واسه همين ساخته شده كه محل دقيق خطاي برنامه رو ذخيره كنه تا برنامه نويس بعدا بتونه مشاهده كنه

odiseh
سه شنبه 10 دی 1387, 14:13 عصر
جناب آقای مداح
ما در برنامه های وب سایتی مون فایلی به نام Program.cs نداریم . میشه بگین برای اون نوع این Handler مون رو کجا باید بگذاریم؟ و سوال بعدی اینکه اگه 3-layer کار کرده باشیم (DAL - BL - UI) در اون صورت چی؟

AmirAlimadadi
چهارشنبه 11 دی 1387, 10:10 صبح
من هم همین سوال رو دارم، ممنون می شم اگه جواب بدین.