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

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

  • 相关阅读:
    NanUI for Winform发布,让Winform界面设计拥有无限可能
    新浪微博.Net SDK第三版源代码和示例【最后一次更新了】
    写个C#命令行参数解析的小工具
    Mac安装Windows 10的简明教程
    自己动手,让Entity Framework Power Tools在VS2015重放光彩
    C++CLI使用.net委托,*Callback注意"this"
    【转】IIS上的反向代理
    asp.net mvc 验证码
    win2008R2 下解决关于mysql odbc无法正常工作问题
    中国健康医学教育网
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/12752965.html
Copyright © 2020-2023  润新知