PDA

View Full Version : سوال: چرا پیام استثناء به درستی منتقل نمیشه؟



hp1361
جمعه 21 تیر 1392, 12:30 عصر
سلام

من از کد زیر برای لاگین استفاده میکنم


function TClientModule1.Login: Boolean;
begin
try
SQLConnection1.Close;
SQLConnection1.Params.Values['HostName'] := '127.0.0.1';
SQLConnection1.Params.Values['Port'] := '80';
SQLConnection1.Params.Values['CommunicationProtocol'] := 'HTTP';
SQLConnection1.Params.Values['DSAuthenticationUser'] := '';
SQLConnection1.Params.Values['DSAuthenticationPassword'] := '';
SQLConnection1.Open;
except
on Ex: TDBXError do
raise Exception.Create('Error No 1 : '+Ex.Message);

on e: eidsocketerror do
raise Exception.Create('Error No 2 : '+e.Message);
on exx:Exception do
raise Exception.Create('Error No 3 : '+exx.Message);
end;
end;


اما چیزی که در زمان استفاده از این تابع در صورت بروز استثنا نمایش داده میشه فقط Error No 1 هستش و پیغام اصلی استثنا خالیه!(ex.message)در صورتیکه اگه در حالت دیباگ باشم دیباگر پیام


Exception class EIdSocketError with message
'Socket Error # 10061

رو نمایش میده!

البته اینم بگم که در حالتی که از TCP/IP استفاده میکنم این مشکل وجود نداره!

مشکل از کجاست؟

hp1361
شنبه 22 تیر 1392, 22:31 عصر
سلام

البته اینم بگم که در فرم اصلی برنامه به شکل زیر از کدهای بالا استفاده کردم


procedure TForm2.bitbtn_1Click(Sender: TObject);
begin
try
ClientModule1.Login;
except
on E :Exception do
ShowMessage(E.Message);
end;
end;


چون در حالت دیباگ کردن دیباگر پیغام زیر رو نمایش میده



Exception class EIdSocketError with message
'Socket Error # 10061


انتظار دارم برنامه هم در حالت خارج از دیباگ هم همین پیغام رو نمایش بده



Error No 1 :
Exception class EIdSocketError with message
'Socket Error # 10061


اما صرفا پیام زیر رونمایش میده



Error No 1 :

hp1361
یک شنبه 23 تیر 1392, 13:30 عصر
این مسئله رو جور دیگه هم میشه تست کرد

اگر یک TSQLConnection روی فرم بزارید و پروتکل رو tcp/ip تعیین کنید. اگر در حالت دیباگ اونرو Open کنید فقط استثناء زیر نمایش داده میشه(سروری در حال اجرا نمی باشد)


Exception class EIdSocketError with message
'Socket Error # 10061


در صورتیکه اگر در حالت دیباگ و پروتکل HTTP بازش کنید دو استثنا زیر نمایش داده میشه


Exception class EIdSocketError with message
'Socket Error # 10061



Exception class TDBXError with message
'Socket Error # 10061
Connection refused.'.


چرا؟
مشکل من بروز 2 استثنا نیست. مشکل اینه که با بروز این حالت دیگه امکان مدیریت استثنا وجود نداره!(مقدار Message استثنا TDBXError خالیه!)

از دوستان اگه راه حلی میشناسن کمک کنن

ممنون

BORHAN TEC
یک شنبه 23 تیر 1392, 14:24 عصر
سلام

مشکل من بروز 2 استثنا نیست. مشکل اینه که با بروز این حالت دیگه امکان مدیریت استثنا وجود نداره!(مقدار Message استثنا TDBXError خالیه!)
ای کاش یک پروژه رو برای تست قرار می دادی. باید ببینم که چه اشتباهی کردی. من خودم یک پروژه نمونه درست کردم و در همین پست ضمیمه کردم که با روش درست برای مدیریت استثناهای لوکال و ریموت آشنا بشی. این پروژه رو بررسی کن. مخصوصاً کد مربوط به دکمه ای که در برنامه Client وجود داره و متد ReverseString در برنامه سمت سرور.
این از کد مربوط به متد ReverseString در برنامه سمت سرور:
uses
Data.DBXCommon;

// ...

function TServerMethods1.ReverseString(Value: string): string;
begin
Result := System.StrUtils.ReverseString(Value);
raise TDBXError.Create('بی خیال');
end;
این هم کد مربوط به دکمه موجود در برنامه سمت کلاینت که میخواد از متد ReverseString موجود در سرور استفاده کنه:
uses
Data.DBXCommon;

// ...

procedure TForm4.Button1Click(Sender: TObject);
var
Server: TServerMethods1Client;
begin
with ClientModule2 do
begin
try
if (SQLConnection1.Connected = False) then
SQLConnection1.Open;
except
on E: Exception do
begin
ShowMessage(E.Message);
Exit;
end;
end;
Server := TServerMethods1Client.Create(SQLConnection1.DBXCon nection);
try

Server.ReverseString('Hello DataSnap');
except
on E: TDbxError do
ShowMessage(StringReplace(E.Message, 'Remote Error', 'خطای سرور',
[rfIgnoreCase]));
end;
end;

end;
اگه باز هم مشکلی بود در خدمتیم.
یا حق...

hp1361
یک شنبه 23 تیر 1392, 20:49 عصر
سلام

ممنون که پیگیری کردی برادر

چیزی که نوشتی مربوطبه مشکل من نمیشه. به پیوست پروژه تستی شامل کلاینت و سرور رو ارسال میکنم.

بدون اجرای سرور برنامه کلاینت رو اجرا کنید و روی دکمه قرارگرفته در فرم کلیک کنید. پنجره پیغامی بخاطر بروز استثنا نمایش داده میشه اما هیچ پیغامی(نوشته ای) درش نیست!

درحالیکه اگه برنامه رو در حالت دیباگ اجرا کنی میبینی که دیباگر پیغام یا همون Message رو نشون میده.

(البته تویپرانتز بگم که اگر نوع ارتباط TCP/IP باشه این مشکل پیش نمیاد)

منتظر پاسخ های گرم شما هستیم

BORHAN TEC
یک شنبه 23 تیر 1392, 22:38 عصر
سلام
این موضوع نیاز به بررسی بیشتری داره. بهتره که سوال رو توی Stackoverflow بپرسی تا Remy Lebeau یا دیگران در خصوص این مسئله موجود در Indy پاسخ بدن. در هر صورت به عنوان یک راه حل اولیه میتونی در قسمت مدیریت استثناها قبل از همه استثناها کلاس Exception رو چک کنی. مثل این:
procedure TForm2.btn_1Click(Sender: TObject);
begin
try
ShowMessage(ClientModule1.ServerMethods1Client.Rev erseString
('Hello World'));
except
on E: Exception do
ShowMessage(E.Message);
on E: EIdSocketError do
ShowMessage((E as Exception).Message);
on E: TDBXError do
ShowMessage(E.Message);
end;
end;

hp1361
دوشنبه 24 تیر 1392, 12:01 عصر
سلام

ماشا... من شدم یابنده بدترین مشکلات datasnap!

برادر عشایری حالا من چطور از کد بالا استفاده کنم؟مثلا کد زیر رو گذاشتم اما کار نکرد!


on E: Exception do
if (e.Message='Socket Error # 10061 Connection refused.') then
ShowMessage('lll');

BORHAN TEC
دوشنبه 24 تیر 1392, 14:46 عصر
سلام

ماشا... من شدم یابنده بدترین مشکلات datasnap!
چیز خاصی نیست. اگه همین چند مورد قلقش دستت بیاد دیگه مشکل خاصی نخواهی داشت.

برادر عشایری حالا من چطور از کد بالا استفاده کنم؟مثلا کد زیر رو گذاشتم اما کار نکرد!
میتونی اینطوری مدیریت کنی:
procedure TForm2.btn_1Click(Sender: TObject);
begin
try
ShowMessage(ClientModule1.ServerMethods1Client.Rev erseString
('Hello World'));
except
on E: Exception do
begin
if (Pos('reset by peer', LowerCase(E.Message)) > 0) then
ShowMessage('1111')
else if (Pos('connection refused', LowerCase(E.Message)) > 0) then
ShowMessage('2222')
else
ShowMessage(E.Message);
end;
end;
end;
موفق باشید...