ايران ويج

نسخه‌ی کامل: (حتما بخونید) Bypass Exceptions
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
دورود به همه دلفی کارهای قهرمان Biggrin

مطمئنا برای همه شما پیش اومده که وسط برنامه هاتون با Error مواجه بشید و بعد برنامتون خود به خود Crash بشه
خب اولین چیزی که به زهنتون میرسه استفاده از دستورات "try...finally" یا "try...Except" هستش که خطاها رو نادیده میگیره.

ولی بعضی وقتها هم هست که اوضاع خیلی بد تر از این حرفاها میشه و تصویر زیر براتون ظاهر میشه...

[تصویر:  exp.png]

حالا باید چیکار کرد؟

تو این مقاله می خوام تابعی رو بهتون معرفی کنم که به صورت 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;
درود بر اسپارتاکوس دلفی کارها Biggrin

ارش جان من اکثر اوقات از TApplicationEvent و OnException ش استفاده میکنم، به نظرت این جوابگو نیست؟وآیا کل پروسه رو در برمیگیره؟

درضمن نگفتی توی همه ورژن های دلفی هست یا نه فقط در ورژن های خاصی این تابع قابل استفاده می باشد.

دمت جیز.
درود دوست من :x
نه دستور OnException فقط در محدوده همون تابع یا پروسیجری که نوشتی عمل میکنه و برای کل پروسه نیست.
بله این یه تابع api هست و قاعدتا باید تو همه ورژن های دلفی جواب بده.