ورود

View Full Version : تشخیص رویداد فراخوانی شده.



حمیدرضاصادقیان
شنبه 23 شهریور 1387, 12:36 عصر
سلام دوستان.من یک ثبت خطا در برنامه نوشتم حالا میخوام بدونم چطوری باید تشخیص بدم وقتی خطا پیش اومد چه رویدادی باعث بروز اون خطا شده.یعنی در اصل بفهمیم چه رویدادی در کل برنامه صدا زده شده است.

vcldeveloper
شنبه 23 شهریور 1387, 16:36 عصر
کار ساده ایی نیست، باید در لحظه خطا، Call Stack را بررسی کنید و ببینید آدرس چه توابعی در لحظه خطا در Call Stack قرار داره. فکر نکنم منظور شما نوشتن همچین چیزی باشه. اگر فقط می خواید همچین قابلیتی داشته باشید، می تونید از مجموعه JEDI استفاده کنید، کدهای برای استخراج اینگونه اطلاعات داره که خودش در Exception Dialog استفاده میکنه. اگر هم یک چیز آماده میخواید، EurekaLog، یا MadException از جمله ابزارهایی هستند که اطلاعات کاملی در این زمینه تولید می کنند و در هنگام خطا نمایش میدند.

Cave_Man
شنبه 23 شهریور 1387, 18:04 عصر
procedure TForm1.FormCreate(Sender: TObject);
begin

try
//some code here
except
showmessage('FormCreate');
end;

end;
اینو واسه تک تک رویدادهایی که میخاید بررسی بشه باید در نظر بگیرید.احتمالا برنامه های آماده هم از همین روش ها استفاده کنن.

vcldeveloper
شنبه 23 شهریور 1387, 18:54 عصر
احتمالا برنامه های آماده هم از همین روش ها استفاده کنن.
خیر، این برنامه ها نمیاد توی تمام کدهای کاربر دست ببرند و یکی یکی به انتهای همه متدها چند خط کد اضافه کنند! بلکه Call Stack را بررسی می کنند. هر تابع یا متدی که اجرا میشه، وقتی در داخل خودش تابع دیگه ایی را فراخوانی میکنه، آدرسش در Stack ذخیره میشه، و کد تابع فراخوانده شده اجرا میشه. به این ترتیب، Call Stack همیشه مسیر اجرای کد را در خودش داره؛ یعنی با بررسی Call Stack میشه فهمید که چه توابعی اجرا شدند تا اینکه به نقطه فعلی کد (مثلا نقطه ایی که خطا درش اتفاق افتاد) رسیدیدم. مشابه همین را در دیباگر خود دلفی هم می تونید ببینید، یک Breakpoint روی کد بزارید، و پنجره Call Stack را باز کنید، می بینید نام تمام توابعی که اجرا شدند تا به Breakpoint مورد نظر برسیم، در اون پنجره نمایش داده میشه.

حمیدرضاصادقیان
یک شنبه 24 شهریور 1387, 10:21 صبح
ممنون. من میخواستم درون کد یک چیزی مثل Call stack بنویسم که مختصات دقیق تابعی که خطا درون اون رخ داده رو پیدا کنم.ولی ظاهرا استفاده از eurekalog بهتره.