PDA

View Full Version : شماره خط و دستوری که باعث خطا شده



SYNDROME
چهارشنبه 19 اردیبهشت 1386, 22:11 عصر
با سلام

می خواستم بدانم چگونه می توان شما خط و دستوری که باعث بروز خطا شده است را بدست آورد؟
در دلفی جدولی است که خطاها در آن وجود دارد.این جدول در کجا قرار دارد؟

dkhatibi
پنج شنبه 20 اردیبهشت 1386, 11:12 صبح
می خواستم بدانم چگونه می توان شما خط و دستوری که باعث بروز خطا شده است را بدست آورد؟
یعنی چی؟
خوب خطی که خطا می دهد روی اون متوق شده مکان نما را به اونجا ببرید و شماره خط را اون پایین در Status Bar می بینی!!

در دلفی جدولی است که خطاها در آن وجود دارد.این جدول در کجا قرار دارد؟
تو help کلمه ی errorرا جستجو کن.

SYNDROME
پنج شنبه 20 اردیبهشت 1386, 12:06 عصر
با سلام

یعنی چی؟
خوب خطی که خطا می دهد روی اون متوق شده مکان نما را به اونجا ببرید و شماره خط را اون پایین در Status Bar می بینی!!

درست ولی می خواهم آن را در یک Message نمایش دهم.
مثلا:
من یک Exe کسی می دهم و شخص زمانی که خطا ظاهر می شود شماره خطا و دستوری را که باعث خطا شده را ببیند و برای من بخواند.

mzjahromi
پنج شنبه 20 اردیبهشت 1386, 12:31 عصر
توی Exe دیگه شماره خط و دستور و این حرفها مطرح نیست. شما میتونید با استفاده از Try Except پیغامهائی رو بذارید که مشخص کنه کجا خطا داده یا اینکه با استفاده از Resource DLL Wizard پیغامهای خطا رو به اون شکلی که خودتون دوست دارید در بیارید. ولی اون هم صد درصد اون چیزی که شما میخواهید در نمیاد

SYNDROME
پنج شنبه 20 اردیبهشت 1386, 15:31 عصر
با سلام

توی Exe دیگه شماره خط و دستور و این حرفها مطرح نیست. شما میتونید با استفاده از Try Except پیغامهائی رو بذارید که مشخص کنه کجا خطا داده یا اینکه با استفاده از Resource DLL Wizard پیغامهای خطا رو به اون شکلی که خودتون دوست دارید در بیارید. ولی اون هم صد درصد اون چیزی که شما میخواهید در نمیاد
ولی این کاری را که من گفتم در VB دوستان انجام دادند.
من هم از سر علاقه می خواهم تو دلفی یاد بگیرم.
حال می شه اون روشهایی را که ممکن من را به این هدف نزدیک کنه توضیح بدید یا Linkهاش رو قرار بدید.(ممنون می شم)
Resource DLL Wizard چطور باید استفاده کنم؟

dkhatibi
پنج شنبه 20 اردیبهشت 1386, 16:09 عصر
ولی این کاری را که من گفتم در VB دوستان انجام دادند.

برنامه ی نمونه ی vb را بذارید.
خوب شما هم می تونید این کار رو بکنید. تو فایل exe که شماره خط معنا نداره.
اما اگر می خواهید جایی که خطا رخ داده را مشخص کنید چون دوستان شما مجبور بوده اند خطا رو جوری مدیریت کنند مثل Try Except دلفی پس می دونستند کجا خط ممکن است اتفاق بیفته و شماره خط رو نیز اونجا اعلام کرده اند.

m-khorsandi
پنج شنبه 20 اردیبهشت 1386, 19:23 عصر
assertion کمکت میکنه،
هر جایی که لازم داری شماره‌ی خط و یونیت رو بشناسی می‌تونی از Assert استفاده کنی،
اصولاً Assert رو در زمان دیباگ استفاده می‌کنند، ولی می‌تونی زمانی که فایل Exe به تنهایی در حال اجراست از Assert به همراه کامپایلر دیرکتیو زیر استفاده کنی:



{$ASSERTIONS ON}


که در ابتدای یونیتت و فقط یکبار می‌نویسی.

SYNDROME
پنج شنبه 20 اردیبهشت 1386, 20:24 عصر
با سلام
شرمنده آقای خرسندی عزیز.
من تا حالا با Assert کار نکردم و نمی دانم باید چطور استفاده کنم.:گیج: :گیج: :گیج:
اگر امکان دارد با یک کد کوچک مثال بزنید.:خجالت: :خجالت: :خجالت:
واقعاً ممنون شما می شوم.

m-khorsandi
پنج شنبه 20 اردیبهشت 1386, 22:21 عصر
این شکل کلی Assert هست :


Assert(Boolean Expression, Message)


اگه عبارت منطقی False باشه، پیغام (یعنی پارامتر بعدی) به همراه نام یونیت و شماره خط نمایش داده می‌شود. بنابراین میتونی از اولین مثال زیر که دائماً اطلاعات مورد نظر رو نمایش میده استفاده کنی.
مثال :


Assert(False, 'Error Information');
Assert(A > 5, 'Message');


بد نیست لینک‌های زیر رو هم ببینی :
Handling Errors and Exceptions in Delphi (http://www.barnamenevis.org/forum/showthread.php?t=60728)
What access violations are and how to prevent AVs (http://www.barnamenevis.org/forum/showthread.php?t=64481)

SYNDROME
جمعه 21 اردیبهشت 1386, 06:18 صبح
با سلام
آقا محمد واقعاً دستت درد نکنه.
انشاا... یک روز بتونم از خجالت تون در بیام.(البته اگر قابل باشم)
یا حق ! ! !

SYNDROME
جمعه 28 اردیبهشت 1386, 10:41 صبح
با سلام
شرمنده یکی و دوتا دیگه سوال برام پیش اومد که ممنون می شم اگر جواب بدید.:خجالت:
1-دستور Assert خوبه ولی زمانی که من در Try . . Except . . . End استفاد ه می کنم در قسمت Except می گذارم که شماره خط خطا رو بده شمازه خطی را که خود Assert قرار دارد می دهد.
2-آیا می شود دستوری که باعث خطا شده است را در Message نمایش داد؟(در
Try . . Except ما چندین دستور وجود دارد.
3-در قسمت BDF که شما در سایت برای Try . . Except (مدیریت خطاها)نوشته اید در قسمتیش گفته اید:
می توانید از رویداد Apllication.Exception بنویسید و خطاها را در سطح برنامه کنترل کنید.
می توانید توضیحات بیشتر و نحوه نوشتن این رویداد را بیان کنید.
سوالات از یکی دوتا که بیشتر شد؟؟؟؟؟؟؟؟:لبخند: :لبخند: :لبخند: :لبخند:
با تقدیم احترام.

m-khorsandi
جمعه 28 اردیبهشت 1386, 11:09 صبح
فرض میکنیم که کلاسی داریم برای کنترل خطاهای برنامه،
این کلاس یک procedure به نام ApplicationException داره که میتونیم اون رو به رویداد OnException شیی Application تخصیص بدیم. این بدنه‌ی procedure کنترل کننده‌ی خطای برنامه‌ست :


Procedure THandleException.ApplicationException(Sender: TObject; Prm_Except: Exception);
begin
//...
end;


این هم تخصیص procedure به رویداد OnException برنامه :


Application.OnException := ApplicationException


از این به بعد اگر خطایی اتفاق بیفتد، این procedure اجرا خواهد شد.

SYNDROME
جمعه 28 اردیبهشت 1386, 12:49 عصر
با سلام

فرض میکنیم که کلاسی داریم برای کنترل خطاهای برنامه،
این کلاس یک procedure به نام ApplicationException داره که میتونیم اون رو به رویداد OnException شیی Application تخصیص بدیم. این بدنه‌ی procedure کنترل کننده‌ی خطای برنامه‌ست :


Procedure THandleException.ApplicationException(Sender: TObject; Prm_Except: Exception);
begin
//...
end;


این هم تخصیص procedure به رویداد OnException برنامه :


Application.OnException := ApplicationException


از این به بعد اگر خطایی اتفاق بیفتد، این procedure اجرا خواهد شد.
آقا محمد اینها را باید کجا برنامه بنویسم؟
اگه میشه یک برنامه کوچک بگذار.:خجالت: :خجالت:
با تشکر

SYNDROME
جمعه 28 اردیبهشت 1386, 20:45 عصر
با سلام
همچنان منتظر راهنمایی و کمک شما هستم.
ببخشید وقت شما را می گیرم.:خجالت: :خجالت:
شرمنده

Mahmood_M
جمعه 28 اردیبهشت 1386, 21:16 عصر
سلام

آقا محمد اینها را باید کجا برنامه بنویسم؟
اگه میشه یک برنامه کوچک بگذار.
با اجازه از آقای خرسندی ...
این Procedure رو باید در قسمت Public یا Private فرم ( بر حسب نیاز ) تعریف کنید و بعد بدنه Procedure رو بنویسید ، حالا هر جایی که خواستید ، مثلا زیر عبارت Implementation ، البته اگه بخواید کلاسی برای این کار تعریف کنید ، باید Procedure رو در قسمت Public یا Private همون کلاس تعریف کرده و ازش استفاده کنید ...

Type
Form1 = Class(TForm)
...
Private
...
Public
Procedure MyExceptionProcedure (Sender : TObject; prm_Excep : Exception)
end;


بعد خود Procedure رو تعریف میکنی که در بالا گفتم کجا ...

و بعد در یک رویداد ، مثلا در OnCreate فرم ، کد آخر یعنی : Application.OnException := MyExceptionProcedure رو می نویسی ...


از این به بعد اگر خطایی اتفاق بیفتد، این procedure اجرا خواهد شد.
-----------
البته این برای وضعیتی بود که شما از کلاس استفاده نکردید ...
اون موقع باید یک تغییراتی ایجاد بشه ، یعنی به جای TForm باید از کلاس مورد نظر استفاده کنید ...

موفق باشید ...

masoode
سه شنبه 29 مهر 1399, 14:46 عصر
آیا می شود در پروسیجری که برای Application.OnException نوشته ایم، نام یونیت و شماره خطی که خطا در آن اتفاق اقتاده است را ذخیره کرد؟