PDA

View Full Version : هندل کردن خطا در کار کردن با Indy



TrueFalse
دوشنبه 15 خرداد 1385, 15:32 عصر
سلام به همه اساتید ، آقا این کد یه برنامه Client هستش . ببینیدMemory leak داره یا نه ؟ ( فرض کنید Server فعال یا موجود نیست و Exception رخ میده )


Begin
idTcpClient1 := TIdTcpClient.Create(nil);
try
idTcpClient1.Host := '127.0.0.1';
idTcpClient1.Port := 1234;
try
idTcpClient1.Connect;
except on E:Exception do
begin
Writeln(E.Message);
Exit;
end;
end;
try
// send , receive data
finally
idTcpClient1.Disconnect;
end;
finally
idTcpClient1.Free;
end;
end.

vcldeveloper
سه شنبه 16 خرداد 1385, 06:23 صبح
چرا اینقدر try-finally پیچش کردی؟!


begin
idTcpClient1 := TIdTcpClient.Create(nil);
try
try
idTcpClient1.Host := '127.0.0.1';
idTcpClient1.Port := 1234;
idTcpClient1.Connect;
//Send/Recieve data
except on E:Exception do
Writeln(E.Message);
end;
finally
idTcpClient1.Disconnect;
idTcpClient1.Free;
end;
end;

TrueFalse
سه شنبه 16 خرداد 1385, 07:04 صبح
ممنون ، من کد ( چست و چابک ) شما ( و کد پیچیده خودم ) ! رو Trace که میکنم ، بعد از رخداد خطا خارج میشه و دستور Free اجرا نمیشه. مشکلی نداره؟

vcldeveloper
چهارشنبه 17 خرداد 1385, 06:50 صبح
دستور Free همیشه اجرا میشه.

B_YAGHOBI
چهارشنبه 17 خرداد 1385, 07:01 صبح
دستور Free وقتی اجرا می شود که خط
idTcpClient1.Disconnect;
دارای Exception نباشد. یعنی خطا ندهد.

TrueFalse
چهارشنبه 17 خرداد 1385, 15:50 عصر
درسته دستور Free اجرا میشه. ( با یه دستور Writeln بعد از دستور Free فهمیدم ) ولی چرا موقع Trace به محض رخداد خطا خارج میشه و اینطور به نظر میاد دستورات بخش Finally اجرا نشدند؟ باید Debugger را تنظیم کرد؟

vcldeveloper
پنج شنبه 18 خرداد 1385, 01:52 صبح
چرا موقع Trace به محض رخداد خطا خارج میشه و اینطور به نظر میاد دستورات بخش Finally اجرا نشدند؟
بعد از مشاهده خطا، پیغام را ببندید و دوباره F7 یا F8 را بزنید.

TrueFalse
جمعه 19 خرداد 1385, 07:40 صبح
همین کارو می کنم.

vcldeveloper
شنبه 20 خرداد 1385, 01:35 صبح
یه BreakPoint روی خط idTcpClient1.Free بزارید.