MTS/COM+对象中try..except无效??? ( 积分: 200 )

  • 主题发起人 主题发起人 kid
  • 开始时间 开始时间
K

kid

Unregistered / Unconfirmed
GUEST, unregistred user!
一个MTS/COM+对象mtsObj1(需要事务)提供一个方法SaveDatas用于更新保存数据,由客户端创建这个对象mtsObj1并调用其SaveDatas方法来保存修改的数据。SaveDatas方法代码如下:
procedure TUpdateCoor.SaveDatas(vDatas: OleVariant;
iMaxErrors: Integer);
begin
try
try
dcomcon.Connected:=True;
cds.Data:=vDatas;
cds.ApplyUpdates(iMaxErrors);
SetComplete;
except
SetAbort;
end;
finally
cds.Active:=False;
dcomcon.Connected:=False;
end;
end;
现在人为产生一个更新数据错误,比如:在客户端修改记录未保存时,先到后端数据库系统里将该记录记变,从而使客户端保存时产生错误。
结果是:客户端出现一个错误提示框,提示:根事务要确认,但事务终止了操作。而我期望的应是这样的错误提示:找不到记录或者已被其他用户更改。
于是我对mtsObj1进行调试,断点分别设在(1)cds.ApplyUpdates(iMaxErrors);(2)SetComplete;(3)SetAbort;
当执行(1)cds.ApplyUpdates(iMaxErrors);先出现一个提示1:“Project dllhost.exe raised exception class EDatabaseError with message 'Record not Fount or changed by another user'. Process stopped. Use Step or Run to continue.”
接着再出现一个提示2:“Project dllhost.exe raised exception class EDatabaseError with message 'Unable to find record. No key specified'. Process stopped. Use Step or Run to continue.”
确定后按F7继续执行,又发现程序不是跳到断点3执行SetAbort,而是继续执行了SetComplete
问题一:为什么不会执行SetAbort;?try ..except..end;
怎么会没有起作用??
问题二:调试中出现的提示1正是我所期待的,但怎么不会反应到客户端,客户端出现的又是另一个提示,这是为什么???
问题三:在MTS/COM+对象中要如何才能捕捉到这些异常并反馈给客户端???
分数不够可以加,请大侠们一定帮我。
 
一个MTS/COM+对象mtsObj1(需要事务)提供一个方法SaveDatas用于更新保存数据,由客户端创建这个对象mtsObj1并调用其SaveDatas方法来保存修改的数据。SaveDatas方法代码如下:
procedure TUpdateCoor.SaveDatas(vDatas: OleVariant;
iMaxErrors: Integer);
begin
try
try
dcomcon.Connected:=True;
cds.Data:=vDatas;
cds.ApplyUpdates(iMaxErrors);
SetComplete;
except
SetAbort;
end;
finally
cds.Active:=False;
dcomcon.Connected:=False;
end;
end;
现在人为产生一个更新数据错误,比如:在客户端修改记录未保存时,先到后端数据库系统里将该记录记变,从而使客户端保存时产生错误。
结果是:客户端出现一个错误提示框,提示:根事务要确认,但事务终止了操作。而我期望的应是这样的错误提示:找不到记录或者已被其他用户更改。
于是我对mtsObj1进行调试,断点分别设在(1)cds.ApplyUpdates(iMaxErrors);(2)SetComplete;(3)SetAbort;
当执行(1)cds.ApplyUpdates(iMaxErrors);先出现一个提示1:“Project dllhost.exe raised exception class EDatabaseError with message 'Record not Fount or changed by another user'. Process stopped. Use Step or Run to continue.”
接着再出现一个提示2:“Project dllhost.exe raised exception class EDatabaseError with message 'Unable to find record. No key specified'. Process stopped. Use Step or Run to continue.”
确定后按F7继续执行,又发现程序不是跳到断点3执行SetAbort,而是继续执行了SetComplete
问题一:为什么不会执行SetAbort;?try ..except..end;
怎么会没有起作用??
问题二:调试中出现的提示1正是我所期待的,但怎么不会反应到客户端,客户端出现的又是另一个提示,这是为什么???
问题三:在MTS/COM+对象中要如何才能捕捉到这些异常并反馈给客户端???
分数不够可以加,请大侠们一定帮我。
 
高手,高手都到哪了???
 
1.
cds.ApplyUpdates(iMaxErrors);
你的iMaxErrors的值是多少?只要设为0就行了。
2.要把服务端的错误消息返回到客户端,在方法里面增加一个返回参数就可以了:
procedure TUpdateCoor.SaveDatas(vDatas: OleVariant;
iMaxErrors: Integer;var ErrMsg:widestring);
begin
ErrMsg:= '';
try
try
dcomcon.Connected:=True;
cds.Data:=vDatas;
cds.ApplyUpdates(0);
SetComplete;
except
on E:Exceptiondo
begin
ErrMsg := E.message;
SetAbort;
end;
end;
finally
cds.Active:=False;
dcomcon.Connected:=False;
end;
end;
 
加上on exceptiondo
,把程序改一改试一下吧:
-------------------------------------------------------
try
dcomcon.Connected:=True;
cds.Data:=vDatas;
cds.ApplyUpdates(iMaxErrors);
SetComplete;
except
on exceptiondo
//语句群
SetAbort;
end;
-----------------------------------------
 
重新抛出异常。
procedure TUpdateCoor.SaveDatas(vDatas: OleVariant;
iMaxErrors: Integer);
begin
try
try
dcomcon.Connected:=True;
cds.Data:=vDatas;
cds.ApplyUpdates(iMaxErrors);
SetComplete;
except // modify begin
on e: Exceptiondo
begin
SetAbort;
raise Exception.Create('找不到记录或者已被其他用户更改。');
end;
// modify end
end;
finally
cds.Active:=False;
dcomcon.Connected:=False;
end;
end;
至于你说的服务端的try...except...end无效,我没有出现过这样的情况。
 
我的iMaxErrors值等于0。
我加入了你们的相应代码?但仍不行。我发现程序在cds.ApplyUpdates(iMaxErrors);执行出错后没有去执行except on ...do
... end;
这段语句,仍是继续执行SetComplete,也就是说出现了异常却不会去执行处理异常的语句,这是怎么回事???
 
1.按理不出现这样的问题,你试试下面代码看看是否跳出:
procedure TUpdateCoor.SaveDatas(vDatas: OleVariant;
iMaxErrors: Integer);
begin
try
try
dcomcon.Connected:=True;
cds.Data:=vDatas;
cds.ApplyUpdates(iMaxErrors);
raise Exception.Create('just raise.');
// Add
SetComplete;
except // modify begin
on e: Exceptiondo
begin
SetAbort;
raise Exception.Create('找不到记录或者已被其他用户更改。');
end;
// modify end
end;
finally
cds.Active:=False;
dcomcon.Connected:=False;
end;
end;
2.有没有试过不再IDE执行时的情况?
 
to JamesBond_L:按你写的代码运行了,执行了
raise Exception.Create('just raise.');
这句,程序跳到
except
on e: Exceptiondo
begin
SetAbort;
raise Exception.Create('找不到记录或者已被其他用户更改。');
end;
但是执行cds.ApplyUpdates(iMaxErrors);这句产生的异常却不会使程序跳到异常处理过程中去。
 
ApplyUpdate方法只会告诉你不成功的记录数,不会raise错误
所以,Except后的语句不执行是正常的
要在privider.OnUpdateError事件中处理错误,如果在这个事件里raise,
则,你的except部分可以捕捉到错误
 
果然,张鸿林一针见血。谢谢大家了。大家都有分,张鸿林请进另一个帖给你再加分。http://www.delphibbs.com/delphibbs/dispq.asp?lid=3184639
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部