m-khorsandi
یک شنبه 15 بهمن 1385, 09:06 صبح
Error و Exception :
هر Exception یی معمولاً یک وضعیت خطاست یا اتفاقی ست که جریان اجرای طبیعی برنامه را متوقف میکند . هر وقت که حاصل پردازش یک خط از کد ، خطایی باشد ، دلفی شیئی میسازد که از کلاس TObject مشتق شده و خطا را توسط آن به نمایش در میآورد.
Guarded Block
هر برنامه یا بوسیله بعضی کدهای خاتمه دهنده ی برنامه یا بوسیله کنترل خطاها ، گاهاً هر دو ، نسبت به خطاها واکنش نشان میدهد. راهی برای به دام انداختن error یا exception روی کدهای مشخص وجود دارد و این زمانیست که بتوانید حدس بزنید در بخشی از کد ، ممکن ست error یا exception یی رخ دهد. Try..Except ،دستورات را در بلوکی حفاظت شده اجرا میکند.
شکل کلی :
try
{guarded block of code}
except
on <ESomeException> do begin
{exception block-handles SomeException}
end;
end;
اگر دستورات نوشته شده در بخش try بدون بروز هیچگونه exception یی اجرا شوند، از اجرای قسمت except صرف نظر میشود و کنترل برنامه به بعد از کلمه کلیدی end منتقل میشود. بنابراین ما دستوراتی که ممکن ست اجرای آنها باعث بوجود آمدن خطایی شود را در بخش try (یعنی بین کلمه try و except) و دستوراتی که بعد از بروز خطا میبایست اجرا شوند را در بخش except (یعنی بین کلمه except و end) مینویسیم، به این قسمت اصطلاحاً exception handling یا کنترل کننده خطا اطلاق میشود.
مثال :
...
Zero:=0;
try
dummy:= 10 / Zero;
except
on EZeroDivide do
MessageDlg('Can not divide by zero!',
mtError, [mbOK], 0) ;
end;
...
مثال بالا را میتوان به شکل ساده زیر نیز نوشت ، که در این حالت هر نوع خطایی با پیغام error! نمایش داده میشود:
...
Zero:=0;
try
dummy:= 10 / Zero;
except
MessageDlg('error !', mtError, [mbOK], 0) ;
end;
...
Protecting Resources – محافظت از منابع :
وقتی که بخشی از کد ،resource یی را در اختیار میگیرد ، اغلب لازم ست که از آزاد شدن آن resource مطمئن شد ، بدون توجه به اینکه اون بخش از کد ، طبیعی خاتمه پیدا کند یا با خطا. در این حالت میتوان از try..finally استفاده کرد. در واقع try..finally ،نوعی بلوک محافظ حافظه ست و میتواند از بوجود آمدن Memory Leak جلوگیری کند و از این نظر کد مطمئنی خواهید داشت.
شکل کلی :
{some code to allocate resources}
try
{guarded block of code}
finally
{termination block - code to free resources}
end;
نحوه ی اجرا به این صورت ست که دستورات مابین کلمات کلیدی try و finally اجرا میشوند و اگر خطایی اتفاق افتاد یا هیچ خطایی اتفاق نیفتاد ، دستورات مابین کلمات کلیدی finally و end اجرا میشوند، یعنی در هر صورت قسمت finally اجرا میشود.
مثال :
...
AboutBox:=TAboutBox.Create(nil) ;
try
AboutBox.ShowModal;
finally
AboutBox.Release;
end;
...
Application.OnException
اگر شما خطاهایی که ممکن ست در یک برنامه اتفاق بیفتد را کنترل نکنید ، دلفی از کنترل کننده ی خطای پیش فرض خود استفاده خواهد کرد، که نتیجه آن نمایش دادن یک message box هست. همچنین میتوانید از رویداد Application.Exception استفاده کنید و کنترل خطا را در سطح Application بنویسید ، به این معنی که نیازی نیست برای هر مجموعه از دستورات (که احتمال خطای آن وجود دارد) ، از try..except استفاده کنید و فقط و فقط کنترل کننده خطا را در این رویداد مینویسید و از این پس با بروز هر error یا exception یی این رویداد به صورت خودکار فراخوانی میشود.
Break On Exceptions – وقفه روی exception ها
وقتی برای قسمتهایی از برنامه ، کنترل کننده خطا (exception handling)مینویسید ، احتمالاً نمیخواهید هنگام بروز یک خطا (که کنترل کننده ی آن را هم نوشته اید) ، برنامه متوقف شود و دلفی، سورس برنامه را به همراه یک پیغام خطای زیبا! نمایش دهد، حداقل در زمان تست کنترل کننده خطا، چون قصد دارید نتیجه کنترل کنندهای را که نوشتهاید ، ببینید. ویژگی بزرگی در دلفی وجود دارد که این کار را برایتان انجام میدهد ، یعنی میتوانید نمایش پیغام خطا را توسط دلفی (که میتواند هنگام تست کنترل کننده خطایی که نوشتید آزار دهنده باشد) غیر فعال کنید.
Tools -> Debugger Options -> Language Exceptions Tab -> Stop on Delphi Exceptions
هر Exception یی معمولاً یک وضعیت خطاست یا اتفاقی ست که جریان اجرای طبیعی برنامه را متوقف میکند . هر وقت که حاصل پردازش یک خط از کد ، خطایی باشد ، دلفی شیئی میسازد که از کلاس TObject مشتق شده و خطا را توسط آن به نمایش در میآورد.
Guarded Block
هر برنامه یا بوسیله بعضی کدهای خاتمه دهنده ی برنامه یا بوسیله کنترل خطاها ، گاهاً هر دو ، نسبت به خطاها واکنش نشان میدهد. راهی برای به دام انداختن error یا exception روی کدهای مشخص وجود دارد و این زمانیست که بتوانید حدس بزنید در بخشی از کد ، ممکن ست error یا exception یی رخ دهد. Try..Except ،دستورات را در بلوکی حفاظت شده اجرا میکند.
شکل کلی :
try
{guarded block of code}
except
on <ESomeException> do begin
{exception block-handles SomeException}
end;
end;
اگر دستورات نوشته شده در بخش try بدون بروز هیچگونه exception یی اجرا شوند، از اجرای قسمت except صرف نظر میشود و کنترل برنامه به بعد از کلمه کلیدی end منتقل میشود. بنابراین ما دستوراتی که ممکن ست اجرای آنها باعث بوجود آمدن خطایی شود را در بخش try (یعنی بین کلمه try و except) و دستوراتی که بعد از بروز خطا میبایست اجرا شوند را در بخش except (یعنی بین کلمه except و end) مینویسیم، به این قسمت اصطلاحاً exception handling یا کنترل کننده خطا اطلاق میشود.
مثال :
...
Zero:=0;
try
dummy:= 10 / Zero;
except
on EZeroDivide do
MessageDlg('Can not divide by zero!',
mtError, [mbOK], 0) ;
end;
...
مثال بالا را میتوان به شکل ساده زیر نیز نوشت ، که در این حالت هر نوع خطایی با پیغام error! نمایش داده میشود:
...
Zero:=0;
try
dummy:= 10 / Zero;
except
MessageDlg('error !', mtError, [mbOK], 0) ;
end;
...
Protecting Resources – محافظت از منابع :
وقتی که بخشی از کد ،resource یی را در اختیار میگیرد ، اغلب لازم ست که از آزاد شدن آن resource مطمئن شد ، بدون توجه به اینکه اون بخش از کد ، طبیعی خاتمه پیدا کند یا با خطا. در این حالت میتوان از try..finally استفاده کرد. در واقع try..finally ،نوعی بلوک محافظ حافظه ست و میتواند از بوجود آمدن Memory Leak جلوگیری کند و از این نظر کد مطمئنی خواهید داشت.
شکل کلی :
{some code to allocate resources}
try
{guarded block of code}
finally
{termination block - code to free resources}
end;
نحوه ی اجرا به این صورت ست که دستورات مابین کلمات کلیدی try و finally اجرا میشوند و اگر خطایی اتفاق افتاد یا هیچ خطایی اتفاق نیفتاد ، دستورات مابین کلمات کلیدی finally و end اجرا میشوند، یعنی در هر صورت قسمت finally اجرا میشود.
مثال :
...
AboutBox:=TAboutBox.Create(nil) ;
try
AboutBox.ShowModal;
finally
AboutBox.Release;
end;
...
Application.OnException
اگر شما خطاهایی که ممکن ست در یک برنامه اتفاق بیفتد را کنترل نکنید ، دلفی از کنترل کننده ی خطای پیش فرض خود استفاده خواهد کرد، که نتیجه آن نمایش دادن یک message box هست. همچنین میتوانید از رویداد Application.Exception استفاده کنید و کنترل خطا را در سطح Application بنویسید ، به این معنی که نیازی نیست برای هر مجموعه از دستورات (که احتمال خطای آن وجود دارد) ، از try..except استفاده کنید و فقط و فقط کنترل کننده خطا را در این رویداد مینویسید و از این پس با بروز هر error یا exception یی این رویداد به صورت خودکار فراخوانی میشود.
Break On Exceptions – وقفه روی exception ها
وقتی برای قسمتهایی از برنامه ، کنترل کننده خطا (exception handling)مینویسید ، احتمالاً نمیخواهید هنگام بروز یک خطا (که کنترل کننده ی آن را هم نوشته اید) ، برنامه متوقف شود و دلفی، سورس برنامه را به همراه یک پیغام خطای زیبا! نمایش دهد، حداقل در زمان تست کنترل کننده خطا، چون قصد دارید نتیجه کنترل کنندهای را که نوشتهاید ، ببینید. ویژگی بزرگی در دلفی وجود دارد که این کار را برایتان انجام میدهد ، یعنی میتوانید نمایش پیغام خطا را توسط دلفی (که میتواند هنگام تست کنترل کننده خطایی که نوشتید آزار دهنده باشد) غیر فعال کنید.
Tools -> Debugger Options -> Language Exceptions Tab -> Stop on Delphi Exceptions