代码之家  ›  专栏  ›  技术社区  ›  darpet

处理连接错误的最佳实践

  •  1
  • darpet  · 技术社区  · 14 年前

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

    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 ?  
        }  
      }  
    }
    

    如果发生连接错误(超时、连接断开…)该怎么办?

    我应该通知用户连接有问题并重试吗? 一些事情能自动完成吗,对用户来说是透明的?

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

    4 回复  |  直到 14 年前
        1
  •  2
  •   erik    14 年前

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

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

    当然,如果你想投入更多的时间,你可以以不同的方式处理不同的错误。首先,区分永久性错误(几分钟后重试不会有帮助)和间歇性错误(下次可以)。例如,如果连接断开,您可以使用新的连接重试(可能防火墙由于不活动而放弃了打开的连接)。但对于超时(可能是网络配置问题)或“HTTP 404未找到”(假设无法更改用于HTTP调用的URL),您可能无法执行任何操作。

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

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

        2
  •  3
  •   Thorbjørn Ravn Andersen    14 年前

    我强烈推荐迈克尔·尼加德斯“释放它!”它花费了相当多的时间来解释如何使您的软件更加健壮。

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

        3
  •  2
  •   Ladislav Mrnka    14 年前

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

        4
  •  0
  •   卢声远 Shengyuan Lu    14 年前

    从呼叫者的角度 MyClient :一般来说,失败的方法调用应该离开 My客户机 处于调用前的状态。这意味着您应该注意如何恢复pre的状态- middletier.saveRecord(123);