做过SOAP的请进:服务模块异常俘获(200分)

  • 主题发起人 主题发起人 龙丹
  • 开始时间 开始时间

龙丹

Unregistered / Unconfirmed
GUEST, unregistred user!
我希望在 SOAP Service 中用一个统一的陷阱来俘获异常,并向客户端报告发生异常的方法名
和相应的错误信息,请问如何实现?
 
正想学,不知从何下学,关注
 
我现在在每一个方法中都套上Try...Except...End,觉得很不舒服
我用THTTPSoapPascalInvoker的OnExceptionEvent事件,不知为什么得不到MethodName
有没有人试过?
 
change the map file options of linker from off to be detail.
 
SOAP Service 的异常是自动捕获的
当客户端的程序出现错误的时候,当你的SOAP Service 服务端处于激活状态时会动态的激活
对应的服务端的错误处理,相应的显示错误!
 
Carson_zzd:
我不太明白你所说的。
一般来说,客户端出现异常不应该传递到服务端,而服务器端也不太可能显示错误,似乎应该恰好反过来才对啊。
 
如果都是用DELPHI开发的服务,为什么一定要在服务端作错误的处理呢,服务端出现异常的
话,在客户端作相应的判断不就可以了吗?
 
问题是服务端出现异常,客户端怎么才能知道呢?
这就需要在服务端俘获错误,然后报告给客户端。
 
to 龙丹
delphi 已作了统一的陷阱来俘获异常了
你什么都不用做啊
 
就象在一般程序中,我们不做错误处理,Application最后也会俘获异常并终止程序一样,
这不是我们期望的效果。
在服务器端,WebService产生的异常一般是不能报告出来的,我们也不清楚发生异常后会
怎样处理,通常会导致 xml 封包出错,因而在客户端报告“无效的 xml 声明”之类的错误,
这样的报告无论是对用户还是对调试人员都是无用的废话。
所以,服务器端的异常俘获我们必须要仔细设计,才能获得有意义的错误报告。
 
最好的方法莫过于用C#的委托来处理所发生的异常,首先定义客户端在远程发生异常后
需被调用的方法,在远程模块中定义委托类型,注意他们之间参数的匹配,具体可以看
C#的委托
 
我现在已经建立了一套机制,可以将服务端的异常返回到客户端,并得知出错的方法名称。
但是,按照这套机制要求编写服务端程序时比较麻烦,在每一个服务功能(对应的方法)中,
都必须用try ... except ... end俘获异常,象这样:
function TDataIDSoapService._CreateNumID(DSetID, DFieldID: string;
Reusable: boolean): TRemoteResult;
begin
try
Result:=CreateRemoteResult(DIDManager.CreateNumID(DSetID, DFieldID, Reusable));
except
on E:Exceptiondo
Result:=ErrorResult(E,'_CreateNumID',1);
end;
end;
其中 ErrorResult 创建一个包含错误信息的对象返回给客户端,客户端会进行相应的处理。
我现在是希望避免在每个方法中都加上 try ... except ... end 外套,而代之以一个统一的
异常俘获陷阱,并能够获知是哪个功能(方法)出的错。
 
Additional控件栏中有一个控件,ApplicationEvent,在其事件OnException中写入代码
判断异常类型就可以了
procedure TForm1.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
begin
if E= ... then
...
else
if E = .. then
...
else
do
something.
end;
这个东东可以捕获Application 的任何异常。
 
在服务端做个报告参数,传回客户端不就行了
 

Similar threads

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