kbmMW客户端,为我们提供了完美的异常处理机制。要想处理好异常,必须理解客户端一个请求,是如何触发异常事件的。让我们先看一下,客户端调用服务端一个方法:
function TMainForm.ConnectServer:Boolean; var r: Variant; c: TkbmMWPooledSimpleClient; begin c:=kbmMWPooledSimpleClientPool.LockObject; try c.ConnectionPool:=Self.kbmMWClientConnectionPool1; c.OnException:=Self.kbmMWPooledSimpleClient1Exception; r := NULL; r := c.SendPing; result:=not VarIsNULL(r); c.OnException:=nil; finally kbmMWPooledSimpleClientPool.UnlockObject(c); end; end;
这个方法,通过c.SendPing方法,向服务器发出请求。如果返回结果不为空,说明服务器可以联接。c是一个kbmMWPooledSimpleClient对象。这里,我们接管了c.OnException事件:
function TMainForm.kbmMWPooledSimpleClient1Exception(Sender: TObject; const AException: Exception): Boolean; begin result:=false;//不再给kbmMW显示异常 end;
在这个事件中,我们只是返回false,告诉kbmMW,你不用管这个异常了。
事情没有这么简单,我们先完整的看一下这个过程:
c.SendPing,会取得一个Transport,通过Transport发出这个调用,而Transport也有个OnException,当Transport在调用服务端方法时产生异常,就会触发这个OnException事件,这里的Transport还有一个重试属性MasRetries,这个属性值决定了Transport.OnException被触发的次数,当重试次数用完,最终会触发OnConnectionLost事件。
无论我们是否接管OnConnectionLost事件,kbmMW都会产生一个异常,而这个异常会触发c.OnException事件。
if Assigned(Transport.FOnConnectionLost) then Transport.FOnConnectionLost(Transport); kbmMWRaiseException(KBMMW_ERR_CLIENT_CONNECTIONLOST,'Connection lost.');
这个异常是一个E文信息,我们必须要处理的,一种方法就是在OnConnectionLost事件中调用Abort,另外一种方法就是修改kbmMW的上面的代码了。
然后我们要处理的就是c.OnException这个事件,kbmMW给我们机会来吃掉他,象上面的代码 result:=false。
写以这里,我们应该画一个流程图了: