kbmMW客户端的异常处理

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。

写以这里,我们应该画一个流程图了:

原文地址:https://www.cnblogs.com/kinglandsoft/p/12752965.html