PDA

View Full Version : سوال: عملکرد try



Delphi7_love
شنبه 16 مرداد 1389, 10:53 صبح
نحوه عملکرد این کد چه جوریه و چه موقع استفاده میشه؟

try
--------------
--------------
--------------
end;
finally
Free;
end;

vcldeveloper
شنبه 16 مرداد 1389, 12:11 عصر
MyObject := TMyClass.Create;
try
/// Do something with MyObject here
finally
MyObject.Free;
end;

یک الگوی متداول برای ساخت یک شی، استفاده از آن، و در نهایت نابود کردن آن، هست. ساختار try-finally تضمین میکنه که کد بخش finally تحت هر شرایطی اجرا بشه (یعنی تحت هر شرایطی متد Free از شی ایجاد شده، فراخوانی بشه).

Delphi7_love
شنبه 16 مرداد 1389, 23:35 عصر
میشه خط به خط کد زیر رو توضیح بدبد؟ اینجا چی ایجاد میشه؟



try
CopyFile(pchar(path+'data\bank.mdb'),pchar(Pname), False);
except
ShowMsg(111111);
end;

vcldeveloper
یک شنبه 17 مرداد 1389, 01:36 صبح
میشه خط به خط کد زیر رو توضیح بدبد؟ اینجا چی ایجاد میشه؟
این یک بلوک try-except هست که به شکل غلطی نوشته شده. این کد، تابع CopyFile رو برای کپی کردن یک فایل به یک آدرس جدید فراخوانی میکنه، و این فراخوانی رو در داخل یک بلوک try-except انجام میده، تا هر خطایی که در زمان اجرای این کد پیش اومد، کد موجود در بلوک except فراخوانی بشه. پس اون ShowMsg فقط در زمان بروز خطا در این کد، اجرا میشه.

استفاده از try-except به اون شکل غلط هست، چون برنامه نویس داره با این کد هر گونه خطایی که ممکنه در کد رخ بده، رو بدون اینکه خطا را مدیریت کنه، یا سایر ساختارهای برنامه را از بروز خطا مطلع کنه، خفه میکنه، و فقط یک پیام به کاربر نمایش میده.

Mahmood_M
یک شنبه 17 مرداد 1389, 01:47 صبح
بلوک Try به دو شکل قابل استفاده هست ، یکی با Finally و یکی هم با Except ، اما منظور از این دو تا چیه ؟
وقتی کدتون رو به صورت زیر می نویسید :
try
A;
finally
B;
end;
ابتدا دستور A که بعد از Try قرار داره اجرا میشه ، وقتی دستور A به پایان رسید ، دستوری که در قسمت Finally قرار داره ، یعنی B اجرا میشه ، نکته ی مهمی که باید بدونید اینه که دستور B چون بعد از Finally قرار داره ، بدون توجه به موفقیت آمیز بودن و نبودن اجرای دستور A اجرا میشه ، یعنی اگر برنامه در اجرای دستور A دچار مشکل بشه باز هم دستور B رو اجرا خواهد کرد ...

اما اگر به جای Finally از Except استفاده کنید :
try
A;
except
B;
end;
دستور B که بعد از Except قرار داره ، فقط زمانی اجرا میشه که دستور A با موفقیت به پایان نرسه یا به نوعی برنامه روی دستور A مجبور به توقف بشه ...

پس به طور کلی وقتی دستور A که بعد از Try قرار داره اجرا میشه دو حالت پیش میاد ، یا دستور بدون مشکل اجرا میشه و برنامه به کارش ادامه میده ، یا اینکه در اجرای این دستور خطایی اتفاق می افته ...
در هر دو حالت دستور B وجود در قسمت Finally اجرا میشه ولی دستور B موجود در قسمت Except فقط در صورتی اجرا میشه که حالت دوم پیش بیاد ، یعنی دستور A با خطا همراه بشه ...

از بلوک Try ... Finally با توجه به ویژگی ای که داره معمولا برای آزاد کردن اشیاء ساخته شده استفاده میشه ، به مثالی که جناب کشاورز قرار دادن دقت کنید :
MyObject := TMyClass.Create;
try
/// Do something with MyObject here
finally
MyObject.Free;
end;
در دستور بالا ابتدا یک شیء به نام MyObject از نوع MyClass ایجاد میشه ، بعد از عبارت Try از شیء ساخته شده استفاده میشه و در نهایت بدون توجه به موفقیت آمیز بودن یا نبودن استفاده از شیء ، دستورات قسمت Finally اجرا میشه که مربوط به آزادسازی حافظه ی شیء ساخته شده هست ...

اما در رابطه با مثالی که قرار دادید :
try
CopyFile(pchar(path+'data\bank.mdb'),pchar(Pname), False);
except
ShowMsg(111111);
end

در کد بالا ابتدا دستور CopyFile اجرا میشه ، اگر در اجرای دستور خطایی پیش بیاد قسمت Except یعنی دستور ShowMsg اجرا میشه ، در غیر اینصورت برنامه از قسمت Except می پره ( البته استفاده از Try ... Except به این صورت صحیح نیست !! )

امیدوارم توضیحات مفید بوده باشه ، موفق باشید ...