【问题标题】:best practice for handling connection errors处理连接错误的最佳实践
【发布时间】:2010-08-25 08:54:40
【问题描述】:

发生连接错误时采用的最佳工作流程是什么。 假设我们有一个连接到中间层的客户端。

class MyClient{   
...   
  void   callServer(){  
    try{  
      middletier.saveRecord(123);  
    }catch(...){  
      // log the error  
      // what to do next (notify the user, take the same step again)?  
      // reinitialize connection ?  
    }  
  }  
}

如果发生连接错误怎么办(超时,连接断开......)

我是否应该通知用户连接出现问题并重试? 是否可以自动完成某些操作,并且对用户透明?

我喜欢的是,不要用错误来打扰用户,然后告诉用户下一步该做什么。
那么处理此类错误的最佳工作流程是什么?

【问题讨论】:

    标签: java .net wcf ejb


    【解决方案1】:

    我强烈推荐 Michael Nygards “放开它!”这花费了相当多的时间来解释如何使您的软件更健壮。

    http://www.pragprog.com/titles/mnee/release-it

    【讨论】:

      【解决方案2】:

      这取决于... 如果操作是由用户交互引起的,请通知用户。用户可以决定他想要重试的频率。代码可能会自行重试,但如果超时,用户可能会等待几分钟(或中止操作而没有得到任何反馈)。

      如果它是后台任务,请在延迟一段时间后重试(但不是无限次 - 最终中止操作)。您可以确保重新初始化连接,这取决于所使用的技术以及您是否使用连接池。

      当然,如果您想投入更多时间,您可以以不同的方式处理不同的错误。首先,区分永久性错误(几分钟后重试无济于事)和间歇性错误(下次可能没问题)。例如,如果连接断开,您可以使用新连接重试(可能防火墙由于不活动而断开了打开的连接)。但是对于超时(可能是网络配置问题)或“HTTP 404 Not found”(假设您无法更改用于 HTTP 调用的 URL),您可能无能为力。

      您可以在“诊断和修复”组件中收集所有这些知识。

      我还建议阅读“释放它!”。

      【讨论】:

        【解决方案3】:

        这完全取决于应用程序的要求。有时最好立即通知用户,有时最好在通知用户之前重试几次请求。您必须咨询您的客户/分析师。

        【讨论】:

        • 我的客户不知道这一点。他们要求我提供最佳解决方案。这就是我询问个人最佳实践的原因。
        【解决方案4】:

        从调用者MyClient 的角度来看:一般来说,失败的方法调用应该使MyClient 处于调用之前的状态。这意味着你应该注意如何恢复 pre-middletier.saveRecord(123); 的状态

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-12
          • 2017-11-26
          • 2016-02-26
          • 2016-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-28
          相关资源
          最近更新 更多