zoukankan      html  css  js  c++  java
  • 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。

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

  • 相关阅读:
    JAVA网络编程入门
    悲观锁和乐观锁
    原子性---Atomic
    volatile关键字
    leetcode_111. 二叉树的最小深度
    leetcode_110. 平衡二叉树
    leetcode_108. 将有序数组转换为二叉搜索树
    leetcode_107. 二叉树的层次遍历 II
    leetcode_104. 二叉树的最大深度
    leetcode_101. 对称二叉树
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/12752965.html
Copyright © 2011-2022 走看看