۱۸-مرداد-۱۳۹۱, ۱۷:۵۹:۲۰
دورود به همه دلفی کارهای قهرمان
مطمئنا برای همه شما پیش اومده که وسط برنامه هاتون با Error مواجه بشید و بعد برنامتون خود به خود Crash بشه
خب اولین چیزی که به زهنتون میرسه استفاده از دستورات "try...finally" یا "try...Except" هستش که خطاها رو نادیده میگیره.
ولی بعضی وقتها هم هست که اوضاع خیلی بد تر از این حرفاها میشه و تصویر زیر براتون ظاهر میشه...
حالا باید چیکار کرد؟
تو این مقاله می خوام تابعی رو بهتون معرفی کنم که به صورت Global عمل میکنه و کل Exception های پروسه تون رو Bypass میکنه
تابع مورد نظر "SetUnhandledExceptionFilter" هستش که میاد کل پروسه رو در بر میگیره
معرفی کلی تابع به شکل زیر هستش:
و روش استفاده اون هم به صورت زیر:
خب در قسمت بالا خروجی رو میتونیم به اشکال مورد نیاز وارد کنیم
مثلا برای فیلتر کردن و نادیده گرفتن Except ها به شکل زیر عمل میشه
مطمئنا برای همه شما پیش اومده که وسط برنامه هاتون با Error مواجه بشید و بعد برنامتون خود به خود Crash بشه
خب اولین چیزی که به زهنتون میرسه استفاده از دستورات "try...finally" یا "try...Except" هستش که خطاها رو نادیده میگیره.
ولی بعضی وقتها هم هست که اوضاع خیلی بد تر از این حرفاها میشه و تصویر زیر براتون ظاهر میشه...
حالا باید چیکار کرد؟
تو این مقاله می خوام تابعی رو بهتون معرفی کنم که به صورت Global عمل میکنه و کل Exception های پروسه تون رو Bypass میکنه
تابع مورد نظر "SetUnhandledExceptionFilter" هستش که میاد کل پروسه رو در بر میگیره
معرفی کلی تابع به شکل زیر هستش:
کد:
function SetUnhandledExceptionFilter(lpTopLevelExceptionFilter: TFNTopLevelExceptionFilter):
TFNTopLevelExceptionFilter; stdcall;
و روش استفاده اون هم به صورت زیر:
کد:
function EXP(const ExceptionInfo: TExceptionPointers): LongWord; stdcall;
begin
...
end;
خب در قسمت بالا خروجی رو میتونیم به اشکال مورد نیاز وارد کنیم
مثلا برای فیلتر کردن و نادیده گرفتن Except ها به شکل زیر عمل میشه
کد:
const
EXCEPTION_CONTINUE_EXECUTION =$ffffffff;
EXCEPTION_EXECUTE_HANDLER = $1;
EXCEPTION_CONTINUE_SEARCH = $0;
function EXP(const ExceptionInfo: TExceptionPointers): LongWord; stdcall;
begin
Result := EXCEPTION_CONTINUE_EXECUTION;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SetUnhandledExceptionFilter (@EXP);
end;