View Full Version : فرق try/finally و try/except
FirstLine
سه شنبه 23 تیر 1383, 21:05 عصر
با سلام
فرق try/finally و try/except چیه؟چجوری میشه خطاهایی که اتفاق میفته را در قسمت except در یک ListBox نمایش داد؟
با تشکر
vcldeveloper
چهارشنبه 24 تیر 1383, 01:27 صبح
دستوراتی که در قسمت finally قرار می گیرند تحت هر شرایطی اجرا می شند ، چه استثناپی روی بده و چه خطایی روی نده ! از این قسمت می تونید بیشتر برای آزاد سازی اشیاپی که ساختید استفاده کنید. در این حالت مطمپن هستید که حتی اگر خطایی هم در برنامه رخ بده شی مورد نظر در آخر کار بدرستی آزاد میشه.
اما کدهای قسمت expect فقط در صورت بروز یک استثنا اجرا میشند و اگر در هنگام خطا لازم باشه کار خاصی انجام بگیره می تونید کدهاتون رو توی این قسمت بزارید.
برای نمایش خطا در ListBox :
try
{some code}
expect
on E: Exception do
ListBox1.Items.Add(E.Message);
end;
vodun
چهارشنبه 24 تیر 1383, 10:18 صبح
دستوراتی که در قسمت finally قرار می گیرند تحت هر شرایطی اجرا می شند ، چه استثناپی روی بده و چه خطایی روی نده ! از این قسمت می تونید بیشتر برای آزاد سازی اشیاپی که ساختید استفاده کنید. در این حالت مطمپن هستید که حتی اگر خطایی هم در برنامه رخ بده شی مورد نظر در آخر کار بدرستی آزاد میشه.
اما کدهای قسمت expect فقط در صورت بروز یک استثنا اجرا میشند و اگر در هنگام خطا لازم باشه کار خاصی انجام بگیره می تونید کدهاتون رو توی این قسمت بزارید.
کشاورز عزیز
Try Finally اصلا برای خطا نیست! این دستور برای راحتی برنامه نویس و کدنویسی کمتر در نظر گرفته شده و زمانی به کار میره که شما قصد خروج از Procedure و Function را دارید و نیاز دارید Object های که ساخته شده را Free کنید . همانطوری که میدانید الزاما خروج از Procedure پایان آن نیست در بعضی جاها شما مجبورید از دستور Exit استفاده کنید و در این هنگام هست شما نیاز دارید که Object های ساخته شده رو free کنید و این کار رو Try Finally به راحتی برای شما انجام میده !
البته ترکیبی از Try Except و Try Finally میتوانید درست کنید که دقیقا فرمایش شما اجابت بشه !
مهدی کرامتی
چهارشنبه 24 تیر 1383, 13:11 عصر
صحبت شما تا حدی صحیح است و تا حدی صحیح نیست. نقل قول از راهنمای دلفی:
Sometimes you want to ensure that specific parts of an operation are completed, whether or not the operation is interrupted by an exception. For example, when a routine acquires control of a resource, it is often important that the resource be released, regardless of whether the routine terminates normally. In these situations, you can use a try...finally statement.
The following example shows how code that opens and processes a file can ensure that the file is ultimately closed, even if an error occurs during execution.
Reset(F);
try
... // process file F
finally
CloseFile(F);
end;
The syntax of a try...finally statement is
try statementList1 finally statementList2 end
where each statementList is a sequence of statements delimited by semicolons. The try...finally statement executes the statements in statementList1 (the try clause). If statementList1 finishes without raising exceptions, statementList2 (the finally clause) is executed. If an exception is raised during execution of statementList1, control is transferred to statementList2; once statementList2 finishes executing, the exception is re-raised. If a call to the Exit, Break, or Continue procedure causes control to leave statementList1, statementList2 is automatically executed. Thus the finally clause is always executed, regardless of how the try clause terminates.
If an exception is raised but not handled in the finally clause, that exception is propagated out of the try...finally statement, and any exception already raised in the try clause is lost. The finally clause should therefore handle all locally raised exceptions, so as not to disturb propagation of other exceptions.
مهدی کرامتی
چهارشنبه 24 تیر 1383, 13:14 عصر
همانطوری که میدانید الزاما خروج از Procedure پایان آن نیست
موافق نیستم. وقتی اجرای یک پروسیجر به پایان میرسه کنترل به پردازش فراخوان برمیگرده. اگر میفرمایید اینطور نیست با مثال ثابت کنید.
Inprise
چهارشنبه 24 تیر 1383, 18:27 عصر
در این هنگام هست شما نیاز دارید که Object های ساخته شده رو free کنید و این کار رو Try Finally به راحتی برای شما انجام میده !
Try/Finally- با اشیاء و حافظه منتسب شده به هر کدام هیچ کاری نداره و نمیتونه داشته باشه . سعی کن در بکار بردن عبارات و مضامین دقت کنی
- مفهوم Try/finally معادل معنی " در هر حال" فارسی یا However در لغات اهالی بلاد کفر است ؛ یعنی اگر بخواهی واقعه یا روندی الزاما" اتفاق بیفته ، حتی اگر خطا یا واقعهء غیر منتظره دیگری قبل از اون رخ بده ، باید ازش استفاده کنیی . به عنوان مثال در نکته ای که آقای کرامتی بهش اشاره کرده ، تو به مترجم میگی ، یک فایل ایجاد کن ، فرآیندهائی روی این فایل انجام بده و " در هر حال" اون فایل رو حتما" ببند . ابتدای توضیح آقای کشاورز کاملا" صحیح است .
موفق باشید
سار
چهارشنبه 24 تیر 1383, 19:45 عصر
همانطوری که میدانید الزاما خروج از Procedure پایان آن نیست
موافق نیستم. وقتی اجرای یک پروسیجر به پایان میرسه کنترل به پردازش فراخوان برمیگرده. اگر میفرمایید اینطور نیست با مثال ثابت کنید.
جناب کرامتی یک سوال در این زمینه:
فرض کنیم از داخل Procedure اول یک Procedure دیگر اجرا شود و دومی کنترل را به برنامه اصی بر گرداند آن وقت چی؟
Procedure اول چه میشود!
Sepidar
چهارشنبه 24 تیر 1383, 22:32 عصر
دومی کنترل را به برنامه اصی بر گرداند آن وقت چی؟
منظورتان چیست؟
مثال بزنید لطفا
سار
پنج شنبه 25 تیر 1383, 14:31 عصر
یه چیزی شبیح این:
procedure a;
begin
Some Code
.....
end;
procedure b;
begin
halt;
end;
begin
.......
a; {Call procedure a}
Some Code ......
end.
در این مثال زمانی که به دستور halt میرسه کار رنامه تموم میشه درحالی که هنوز پروسیجر a کامل اجرا نشده.
در حالی که از آن خارج شده. همانطور که دوستان گفتن از پروسیجر خارج شدیم ولی کدهای آن کامل اجرا نشده.
ولی آقای کرامتی گفتن که با این مطلب موافق نستن.
ممکنه بیشتر توضیح بدید.
شاید من درست متوجه منظورتون نشدم.
مهدی کرامتی
پنج شنبه 25 تیر 1383, 15:54 عصر
اولا که در حالت استفاده از دستور Halt دیگر کنترل به فراخوان اصلی برگردانده نمیشود، بلکه به سیستم عامل محول میشود.
ثانیا، اگر از چنین دستوری (Halt ، خروج بدون شرط) استفاده نشود کنترل به پروسیجر فراخوان برگردانده میشود.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.