PDA

View Full Version : ایجاد کلاس خطا



iman_Delphi
چهارشنبه 07 دی 1390, 15:13 عصر
با عرض سلام خدمت دوستان عزیز
من میخواستم یک کلاس برای خطاهایی که در برنامه هایی که مینویسم رخ میده ایجاد کنم
نیاز به یک همفکری دارم

مثلا" امکانات زیر رو داشته باشه

1- متن خطا نمایش داده شود
2- آیکن مناسب نمایش داده شود
3- در سیستم کاربر لاگ شود
4- در پایگاه اطلاعاتی نرم افزار در صورت لزوم درج گردد
5-امکان معادل سازی به زبان متفاوت باشد
6-خطا دارای کد باشد
7-در همان لحظه علت خطا نمایش داده شود
8-در همان لحظه امکان راهنمایی برای جلوگیری از بروز خطا نمایش داده شود
9- امکان ارتباط با سایت شرکت باشد تا در صورت بروز مشکل پشتیبانی آنلاین انجام شود


حالا می خواستم ببینم کسی هست که پیشنهاد بهتری داشته باشه ؟
و نظرتون رو در مورد موارد ذکر شده بالا ذکر کنید - هم انتقاد و هم پیشنهاد

با دلفی 2010 و SQL 2008

M_Maskout
پنج شنبه 08 دی 1390, 21:45 عصر
سلام
به این تاپیک (http://barnamenevis.org/showthread.php?280762-مدیریت-خطاها-و-استثنائات-(Exception)-و-نمایش-پیام-مناسب-با-توجه-به-خطای-رخ-داده-در-دلفی) یه سری بزنید و لینکی که تو پست 6# (http://barnamenevis.org/showthread.php?280762-مدیریت-خطاها-و-استثنائات-(Exception)-و-نمایش-پیام-مناسب-با-توجه-به-خطای-رخ-داده-در-دلفی&p=1242087&viewfull=1#post1242087) اون هست رو هم ملاحظه کنید.
امیدوارم به دردتون بخوره.
لطفاً اگه که راه کار مناسبی پیدا کردین، در صورت امکان، راه رو تو همین تاپیک بنویسین.

iman_Delphi
شنبه 10 دی 1390, 10:13 صبح
سلام
متشکرم بابت پیگیری دوست عزیز- مثل اینکه این بحث بسیار مهم و پیچیده است و همچنین اساتید سایت قبلا" در موردش مباحثی رو مطرح کردن که جای تشکر داره

چون میشه گفت این مورد در تمام برنامه ها استفاده میشه و کاربرد داره.


لطفاً اگه که راه کار مناسبی پیدا کردین، در صورت امکان، راه رو تو همین تاپیک بنویسین.



Try
Application.run;
Except
mymessageshow('یک خطایی رخ داده است');
End;


:قهقهه:

همانطور که اساتید گفته بودن یه روتین هایی برای این کار از قبل فراهم شده مثل http://www.eurekalog.com/index_delphi.php و MadException که بابت بعضی هاشون باید هزینه کنید و وقت صرف پیداکردن نکته هاش کنید و مشکلتون رو تا جایی حل کنید. البته به نظر من اگر خودمون راه کاری بچینیم و چرخ رو دوباره اختراع کنیم بهتره چون این بار یه چرخ سبک تر - مقاوم تر و زیباتر میسازیم و هم به بعضی ها میگیم که چرخ رو باید تا همیشه اختراع کرد.

دوم اینکه همونطور که در پستهایی که قبلا" بهش پرداختند مواردی رو باید در نظر بگیریم که مثلا" کدوم خطاها به لایه های بالاتر برسند، کدوم خطاها توسط خود سیستم تحلیل بشن و ما متوجه بشیم و یا نشیم (عمرا" نمیشه)، و یا اینکه خطا ها رو گروه بندی کنیم و.... که تمام مواردی رو که در این راستا انجام میشه در قالب مدیریت خطاها در برنامه دسته بندی میشه کرد.

البته به جز مواردی که در لایه کاربری برای نمایش راه کار و عنوان خطا و علت و... مثل بالا ذکر کردم مواردی هم نیاز هست تا در کد بتونیم ازشون استفاده کنیم و اون این هست که باید این مبحث (مدیریت خطا) طوری طراحی بشه که برای هر نرم افزاری که می خواییم بنویسیم دوباره نویسی نکنیم و یا خط به خط برناممون رو با Try نیایم کنترل کنیم اسمشو بزاریم که خطاها میدیریت شدند.
چون اینطوری من میتونم بگم که در کل برنامه هرجا تقسیم داشتیم باید یه try بزاریم چون ممکنه هر 1000 سال اتفاق div by 0 میخواد رخ بده.

در خصوص مباحث مهندسی و برنامه نویسیش باید یه مدت بیشتری زمان بزارم تا تمامی صحبت هایی که در سایت برنامه نویس و غیره و غیره شده جمع آوری کنم و چکیده اون رو اینجا بزارم تا دوستان دیگه هم استفاده کنند.
متشکرم

Felony
شنبه 10 دی 1390, 10:18 صبح
البته به نظر من اگر خودمون راه کاری بچینیم و چرخ رو دوباره اختراع کنیم بهتره چون این بار یه چرخ سبک تر - مقاوم تر و زیباتر میسازیم و هم به بعضی ها میگیم که چرخ رو باید تا همیشه اختراع کرد.
هر چقدر هم سعی و تلاش کنی بدون یک گروه خبره نمیتونی نصف چرخ هایی مثل MadExcept رو هم بسازی , پس سعی کن از همون چزخ های آماده استفاده کنی !

iman_Delphi
شنبه 10 دی 1390, 11:06 صبح
آقای تاجیک ما ملت ژاپن نیستیم اما ژاپنی ها یه راه کاری دارن برای رسیدن به هدف - اینکه : اگر کسی میتونه کاری رو انجام بده پس تو هم می تونی انجام بدی و اگر کسی نمی تونه کاری رو انجام بده تو باید تلاش کنی تا بتونی انجام بدی.

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


امکان معادل سازی به زبان متفاوت باشد

در ضمن با MadExcept امکان بالا رو باز خودت باید دستی بنویسی
همچنین MadExcept خیلی پیشرفته هست قربونت - چرخ بنز رو که زیر فرقون نمیندازن داداش

Mask
شنبه 10 دی 1390, 13:13 عصر
با سلام.
منم مثل شما یه چند روزیه دارم رو این قضیه کار میکنم.
این چند پست رو پیدا کردم که خیلی کمکم کرد.
http://barnamenevis.org/showthread.php?127092-Advanced-Exception-Handler-.-%DB%8C%D8%A7%D9%81%D8%AA%D9%86-%D8%AF%D9%82%DB%8C%D9%82-%D9%85%DA%A9%D8%A7%D9%86-%D8%AE%D8%B7%D8%A7.&p=615322&viewfull=1#post615322
http://edn.embarcadero.com/article/30115
http://barnamenevis.org/showthread.php?280265-%DA%86%D9%83-%D9%83%D8%B1%D8%AF%D9%86-%D8%AF%D9%8A%D8%AA%D8%A7%D8%A8%D9%8A%D8%B3-SQL-%D8%AF%D8%B1-%D9%87%D9%86%DA%AF%D8%A7%D9%85-%D8%A7%D8%AC%D8%B1%D8%A7%D9%8A-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87&p=1241420&viewfull=1#post1241420
http://www.eurekalog.com/index_delphi.php
من که خودم با هیچکدومشون زیاد حال نکردم.
خودم دارم یه روال براش مینویسم.
تا حالا کارهای زیر رو انجام دادم.
ایجاد یه لوگ فایل - نمایش مشخصات سیستم - لیست پروسه های در حال اجرا - نمایش اسم تابع یا روال صدا زننده روال - الان هم دارم ارسال به ایمیلش رو مینویسم.
اگه نظر دیگه ای داشتید و فکر میکنید مفیده بفرمایید تا بررسی بشه.

iman_Delphi
شنبه 10 دی 1390, 14:10 عصر
آقای Gold در خصوص پیشنهاد جدید به نظر من از تاپیک اول هم استفاده نمائید.

مشخصه نرم افزارتون - مشخصه سخت افزار و.... رو هم در هنگام ارسال آنلاین در نظر بگیریدکه امکانات VIP هم بتونید برای مشتری ها در نظر بگیرید.
همچنین راهنمایی به صورت آنلاین هم بد نیست.

BORHAN TEC
شنبه 10 دی 1390, 14:37 عصر
بجز madExcept من استفاده از خود JVCL رو پیشنهاد می کنم که نحوه استفاده از آن بسیار آسان است و امکانات بسیار خوبی رو به شما میده. برای آشنایی بیشتر می توانید به آدرس زیر بروید:
www.embarcadero.com/coderage5/sessions
و ویدئوی آموزشی مربوطه را تحت عنوان Building Robust Applications with Customized Exception Management دانلود کنید.

Mask
شنبه 10 دی 1390, 18:29 عصر
بجز madExcept من استفاده از خود JVCL رو پیشنهاد می کنم که نحوه استفاده از آن بسیار آسان است و امکانات بسیار خوبی رو به شما میده. برای آشنایی بیشتر می توانید به آدرس زیر بروید:
www.embarcadero.com/coderage5/sessions
و ویدئوی آموزشی مربوطه را تحت عنوان Building Robust Applications with Customized Exception Management دانلود کنید.

من تو این لینکی که دادید همچین فیلمی رو نمیبینم. میشه بررسی بفرمایید.

BORHAN TEC
شنبه 10 دی 1390, 22:08 عصر
من تو این لینکی که دادید همچین فیلمی رو نمیبینم. میشه بررسی بفرمایید.
در این صفحه چند تا سربرگ وجود داره که در یکی از اونها است.

Mask
سه شنبه 13 دی 1390, 14:13 عصر
من هر چی تلاش کردم. حتی از رو فیلم. نتونستم لوگ فایلم رو با ویزاردی که jcl داره ،ایمیل کنم.
تا حالا کسی این کار رو انجام داده.؟
بعد از اتمام ویزار یه صفحه میاد که میگه یه باگ پیدا شد و گزارش کنید به سایت.و یه دکمه close . همین.

BORHAN TEC
سه شنبه 13 دی 1390, 16:04 عصر
توی اون فیلمی که به شما گفتم اصلاً فایل لاگ رو ایمیل نمیکنه. در اونجا از قبل یک وب سرویس ساخته بود که اطلاعات مربوط به لاگ رو به اون می فرستاد. برای ساخت وب سرویس ابزار های زیادی وجود داره. به عنوان مثال اگر می خواهید با دات نت آن را بسازید می توانید از WCF استفاده کنید و اگر هم می خواهید با دلفی اون رو بسازید بهتره که از DataSnap استفاده کنید ولی باید توجه داشته باشید که وب سرویس ساخته شده در دلفی بهتر است که مبتنی بر ISAPI DLL باشد که در این صورت باید از سرویس دهنده هاست خود بپرسید که آیا از ISAPI DLL پشتیبانی می کند یا خیر؟!!!

Mask
شنبه 17 دی 1390, 21:00 عصر
بعد از اندی تلاش : یه سری یونیت مخصوص اینکار نوشتم.
میزارم دوستان استفاده کنند.
امکانات :
1- بدست آوردن مشخصات سیستم (اسم سیستم - نام کاربر جاری - نام کلیه کاربران - سطح دسترسی یوزرها - نام دامین و ... )
2- بدست آوردن نام خطا و کلاس خطا
3- بدست آوردن جای دقیق خطا و اسم کنترل و ... (از یونیتهای jvcl کمک گرفته شده)
4- ذخیره در فایل لوگ
5- ایمیل به برنامه نویس .البته فقط gmail
نیازها :
1- نصب کامپوننت های jcl و jvcl بر روی دلفی
2- همراه بودن فایلهای Project1.jdbg و libeay32.dll و ssleay32.dll در کنار برنامه.
نمونه کد:
یه کنترل ApplicationEvents بر روی فرم برنامتون بزارید و دستور زیر رو در رویداد Exception بنویسید

CreateLogFileForException(e.ClassName,e.Message,Tr ue,false,false,True,ExtractFilePath(Application.Ex eName)+'log.log',
true,'GoldGmail','12345','Except','Gold@yahoo.com' );
البته یونیت Unit_Exception رو یوز کنید.
در ضمن برای ارسال ایمیل مشخصات خودتون رو باید وارد کنید.

Site Admin
شنبه 17 دی 1390, 22:54 عصر
با سلام دوست گرامی اینجوری که بدرد نمیخوره چند تا dll بزاریم کنار فایل اجرایی نظرتون در باره یک تابع سراسری جهت ترجمه و ثبت خطاها داشته باشیم چطوره

Mask
یک شنبه 18 دی 1390, 10:36 صبح
با سلام دوست گرامی اینجوری که بدرد نمیخوره چند تا dll بزاریم کنار فایل اجرایی نظرتون در باره یک تابع سراسری جهت ترجمه و ثبت خطاها داشته باشیم چطوره
این dll ها برای ارسال ایمیل به Gmail هستش . قسمت تشخیص خطا و ریپورترش نیازی به dll و فایل اضافی نداره.
میتونید اگه نیاز به ارسال ایمیل ندارید. این dll ها رو کنار برنامتون نذارید.

m_farshad
دوشنبه 03 بهمن 1390, 17:25 عصر
من تو برنامم از یه تابع استفاده کردم که در صورت وقوع خطا اجرا میشه
تو یه فرم اصلی که باید در ابتدای برنامه باشه میزارم بعد خودش بقیه کارها رو انجام میده
procedure Tlogin.DoHandleException(Sender: TObject; E: Exception);
var
FileName: string;
IsContinuable: Boolean;
MySettings: TFormatSettings;
APath : string;
begin
// Get the path to the data
APath := ExtractFilePath(Application.ExeName);
IsContinuable := not (E is EAccessViolation);
FileName := APath + '/images/ErrorMessage.app';
try
GetLocaleFormatSettings(GetUserDefaultLCID, MySettings);
MySettings.DateSeparator := '-';
MySettings.TimeSeparator := ':';
MySettings.ShortDateFormat := 'yyyy-mm-dd';
MySettings.LongTimeFormat := 'hh:nn:ss';

if FileExists(FileName) then
Memo1.Lines.LoadFromFile(FileName);
Memo1.Lines.Add(' <Error>');
Memo1.Lines.Add(' <Date>'+ DateTimeToStr(Now, MySettings)+'</Date>');
Memo1.Lines.Add(' <Form>'+ Screen.ActiveForm.Name +'</Form>');
Memo1.Lines.Add(' <Title>'+ E.Message+'</Title>');
Memo1.Lines.Add(' </Error>');
Memo1.Lines.SaveToFile(FileName);

finally
Memo1.Clear;
end;
if not IsContinuable then
begin
CustomMsg(ALERT_, ALERT_APPLICATION_ERROR, mtError, [mbOK]);
Application.Terminate;
end;
end;

procedure Tlogin.FormCreate(Sender: TObject);
begin
/// error reporting
FPrevHandleException := Application.OnException;
Application.OnException := DoHandleException;
end;

procedure Tlogin.FormDestroy(Sender: TObject);
begin
/// error reporting
Application.OnException := FPrevHandleException;
end;