• 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。

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

  • 相关阅读:
    jenkins:用jenkins通过ssh部署jar包到远程linux机器(jdk 15 / jenkins 2.257)
    linux(centos8):安装java jdk 15 (java 15)
    38. 外观数列 迭代
    58. 最后一个单词的长度
    kmp字符串匹配
    单词规律
    1502. 判断能否形成等差数列
    1496. 判断路径是否相交
    1475. 商品折扣后的最终价格
    一维数组的动态和
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/12752965.html
Copyright © 2020-2023  润新知