نقل قول نوشته شده توسط M_Maskout مشاهده تاپیک
شیئ Application، ویژگی‌ها، متدها و وقفه‌های جالبی داره که به کمک اونا می‌شه خیلی از مدیریت‌ها رو روی کل برنامه انجام داد.
پیشنهاد می‌دم یه روتین برای وقفه‌ی OnException اون بنویسین و توی اون وقفه، خطاهای پیش اومده در کل برنامه رو مدیریت کنین، هم برنامه خیلی حرفه‌تر می‌شه، هم دست شما برای انواع کنترل روی کل برنامه در زمان بروز خطا باز می‌شه.
مثلاً در وقفه FormCreate از فرم اصلی برنامه دستور
Application.OnException := OnException;
رو قرار بدین بعد هم روتین OnException رو در ادامه به عنوان یکی از متدهای همین فرم تعریف کنین. یه چیزی مثل این:

 
uses ComObj;
TfrmMainForm = class(TForm)
procedure FormCreate(Sender: TObject);
procedure OnException(Sender: TObject; E: Exception);
end;

procedure TfrmMainForm.FormCreate(Sender: TObject);
begin
Application.OnException := OnException;
end;

procedure TfrmMainForm.OnException(Sender: TObject; E: Exception);
begin
ShowMessage(E.Message + ' (Error Code: ' + IntToStr(EOleException(E).ErrorCode) + ')');
end;


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

ShowMessage(E.Message + ' (Error Code: ' + IntToStr(EOleException(E).ErrorCode) + ')');

از دستور


ShowMessage(E.Message+' ('+E.ClassName+')');
استفاده بشه، در زمان بروز خطا، عبارت داخل پرانتز در پنجره نمایش داده شده، نام کلاسی که خطا رو کنترل کرده (ایجاد کرده) نمایش داده می‌شه.
در خطاهایی که در اثر استفاده از AdoConnection ایجاد می‌شه، نام کلاس، EDatabaseError هست و البته با استفاده از این کلاس نمی‌شه مدیریت چندانی روی خطا انجام داد. اما چون AdoConnection یه شیء OLE هست، می‌شه با استفاده از تبدیل کلاس خطای ایجاد شده به EOleException و استفاده از ویژگی ErrorCode اون کل خطای بوجود اومده رو مدیریت کرد. فقط لازمه کد خطا رو بدونید که برای این منظور می‌تونید از ساختار case ... of و شاخه else اون استفاده کنین یه چیزی مثل این:

[LTR_INLINE]
case EOleException(E).ErrorCode of
.
.
.
else
ShowMessage(E.Message + ' (Error Code: ' + IntToStr(EOleException(E).ErrorCode) + ')');
end;
[/LTR_INLINE]


با استفاده از ساختار کد بالا شماره خطاهای پیش بینی نشده (فقط خطاهای اشیاء OLE) مشخص می‌شه و می‌شه بعداً این شماره خطاها رو هم در برنامه مدیریت کرد.
توجه: به استفاده از یونیت ComObj در قسمت uses توجه کنید، در غیر اینصورت نمی‌تونین از کلاس EOleException استفاده کنین.
دوست عزیز بارها بحث شده که رویداد OnException برای این هست که نحوه نمایش پیغام رو پیشرفته تر یا بخواهیم لوگ کنیم. این استفاده از این رویداد چندان جالب نیست. تا اونجایی که من می دونم پیغام خطای مناسب در ADO داده میشه و نیازی به کشف کد خطا نیست. اینجوری تنها حجم کد بالا میره بدون اینکه کار مثبتی انجام شه. شیوه minair2004 جذاب تر هست. منتها خوشحال می شم تجربه های شخصی تون رو در اینباره بیشتر بدونم.