View Full Version : ثبت نام Procedure در هنگام خطا
MY DEAR DELPHI
جمعه 27 آذر 1388, 13:34 عصر
سلام و خسته نباشید
من در اکثر کدها از try استفاده کردم . الان می خوام اگه اون قسمت از کدم اجرا نشد در Except اطلاعاتی را به یکی از Table های برنامه بنام ErrorLog بفرستم .اولا کدی رو که بتونه
نام Procedureی که اون خطا درش اتفاق افتاده و تو چه خطی از اون Precedure بوده رو برگردونه میخواستم و اگه بشه Message خطا رو هم در اون Table ثبت کنم
با تشکر
Felony
جمعه 27 آذر 1388, 16:54 عصر
میتونید یک پروسیجر بنویسید و در هنگام خطا اون پروسیجر رو فراخوانی کنید و نام پروسیجر فراخوان و متن Error رو به عنوان پارامتر ورودی به پروسیجر بدید و داخل پروسیجر توسط این 2 پارامتر ورودی اطلاعات دلخواهتون رو در Table مورد نظر ثبت کنید .
MY DEAR DELPHI
جمعه 27 آذر 1388, 18:05 عصر
کاری که گفتید انجام دادم . فقط نام Procedure و متن اون خطا رو چطوری بدست بیارم .
آیا کدی که خودش نام Procedure رو بده هستش یا باید خودم دستی وارد کنم ؟
بعد از کجا متن خطا رو حدس بزنم ؟
هدف من از اینکه در پست قبلی Line خطا رو می خواستم این بود که اگه نوع خطا معلوم نشه بتونم از اون استفاده کنم .
در هنگام کد نویسی یک عددی در سمت چپ که شماره خط رو معلوم می کنه نمایش داده می شه من می خواستم اون شماره رو در فیلد ErrorLine ثبت کنم .
ممنون از کمکتون
Felony
جمعه 27 آذر 1388, 19:02 عصر
کاری که گفتید انجام دادم . فقط نام Procedure و متن اون خطا رو چطوری بدست بیارم .
آیا کدی که خودش نام Procedure رو بده هستش یا باید خودم دستی وارد کنم ؟
بعد از کجا متن خطا رو حدس بزنم ؟
پروسیجرتون تقریبا باید این شکلی بشه :
Procedure ErrorLog(ProName,Mess:String);
begin
// Insert code of add to error log table here
end;
این هم یه نمونه کد برای فراخوانی پروسیجر ErrorLog :
begin
try
// Do Something
except
On E : Exception do
ErrorLog(Sender.ClassName,E.Message);
end;
end;
هدف من از اینکه در پست قبلی Line خطا رو می خواستم این بود که اگه نوع خطا معلوم نشه بتونم از اون استفاده کنم .
در هنگام کد نویسی یک عددی در سمت چپ که شماره خط رو معلوم می کنه نمایش داده می شه من می خواستم اون شماره رو در فیلد ErrorLine ثبت کنم .
از اینکه میشه خطی که پیغام خطا رو به وجود آورده رو به دست آورد اطلاعی ندارم ولی فکر نکنم به طور معمول بشه این کار رو کرد .
MY DEAR DELPHI
جمعه 27 آذر 1388, 19:32 عصر
SilverSoft عزیز
این Procedureی هست که من نوشتم
Procedure TestErrorLog(ProcedureName,MessageText : String);
Begin
with DataModule2.ADOQuery1 Do
Begin
Close;
SQL.Clear;
SQL.Text := 'Select * From ErrorLog';
Open;
Insert;
DataModule2.ADOQuery1['ErrorProcedure'] := ProcedureName;
DataModule2.ADOQuery1['MessageText'] := MessageText;
Post;
ShowMessage('(1 row(s) affected)');
End;
End;
و این هم کدی که خودت گفتی
With Label1 Do
Begin
Try
Label1.Caption := FloatToStr(StrToFloat(Edit1.Text)/0);
Except
On E : Exception Do
TestErrorLog(Sender.ClassName,E.Message);
End;
End;
ولی اون جیزی که به عنوان ErrorProcedure ثبت می کمه TButton
در حالی که من نام اون Procedureی که اون خطا رو ایجاد کرده می خوام
مثلا
TTestForm.ButSaveClick
Felony
جمعه 27 آذر 1388, 19:42 عصر
ولی اون جیزی که به عنوان ErrorProcedure ثبت می کمه TButton
در حالی که من نام اون Procedureی که اون خطا رو ایجاد کرده می خوام
مثلا
TTestForm.ButSaveClick
در این مورد اطلاعی ندارم ، فکر نکنم بشه و باید دستی نام رو وارد کنید ، شاید هم بشه ولی من اطلاعی ندارم .
vcldeveloper
شنبه 28 آذر 1388, 00:12 صبح
ولی اون جیزی که به عنوان ErrorProcedure ثبت می کمه TButton
خب، وقتی شما به عنوان پارامتر به تابع ClassName رو ارسال می کنید، انتظار دارید چی ثبت بشه؟! اگر میخواید نام یک تابع بخصوص ثبت بشه، باید نام آن تابع را به عنوان پارامتر ارسال کنید.
نام Procedureی که اون خطا درش اتفاق افتاده و تو چه خطی از اون Precedure بوده رو برگردونه
به این کار میگن دریافت Call Stack که منظور از آن دریافت لیستی از توابعی هست که اجرای آنها منجر به بروز خطا شده. اولین تابع موجود در لیست آخرین تابعی هست که اجرا شده، یعنی همان تابعی که خطا در آن رخ داده.
نوشتن کدی که Call Stack رو در هنگام خطا به دست بیاره کار ساده ایی نیست. در این زمینه کدها و کامپوننت های آماده ایی وجود دارند، مثل Eureka Log، یا MadException. علاوه بر اینها، در مجموعه اوپن سورس JCL هم توابعی برای به دست آوردن Call Stack وجود داره، که می تونید از آنها در برنامه خودتان استفاده کنید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.