【问题标题】:What's a good approach to writing error handling?编写错误处理的好方法是什么?
【发布时间】:2010-01-05 22:27:35
【问题描述】:

我讨厌编写错误条件代码。我想我没有一个好的方法来做到这一点:

  • 您是否编写了所有“功能性” 先代码,然后返回并添加 错误处理,反之亦然?
  • 您认为您的用户有多愚蠢 是?
  • 你的粒度有多细? 抛出异常?

有没有人有明智的建议可以让这更容易?

很多很好的答案,谢谢。实际上,我得到的关于与用户打交道的答案比我想象的要多。我实际上对后端的错误处理、处理数据库连接失败和前端的潜在影响等更感兴趣。让他们来吧!

【问题讨论】:

  • 第一个项目符号不好 - 你会忘记一半的错误处理。

标签: exception exception-handling error-handling


【解决方案1】:

我可以回答一个问题:您不需要假设您的用户是“愚蠢的”,您需要帮助他们使用您的应用程序。为事情显示漂亮的提示,验证数据并解释原因,所以对他们来说很明显,如果你不能处理他们所做的事情(或者更具体地说,你让他们做的事情),不要在他们面前崩溃,显示一个很好的页面来解释他们可以做什么,等等。

尊重他们,不要以为他们对你的系统了如指掌,你来这里是为了帮助他们

关于第一部分;我一般在当时写大部分的错误处理,稍后再补充一点。

我一般不会抛出那么多异常。

【讨论】:

  • 听起来对我来说太无私了。 :p
  • +1; “你的”系统试图解决用户问题。如果它造成另一个问题,就不能成为一个好的系统。
  • 正确,您需要帮助他们使用您的应用程序。能够帮助用户的一个关键部分是以最有意义的方式捕捉每一个可能的错误,这意味着假设所有可能失败的事情都会失败,并且您更好地准备和正确处理它。否则,您可以为您的用户做的就是显示一个弹出窗口,上面写着“意外错误”。应用程序现在将退出”。
  • 我同意。通常,通过首先验证您的数据来避免引发异常。但是如果你确实抛出了一个异常,请确保它是有意义的。哪一个是用户更有可能修复的:“无法创建 XML 序列化文件”或“文件名只能包含 [XYZ] 字符”?例外是针对特殊事物的,但如果您希望您的用户能够使用它做某事,那么它们必须有意义。
【解决方案2】:

假设您的用户什么都不知道,并且会以任何可能被破坏的方式破坏您的系统。

然后相应地编写您的错误处理代码。

【讨论】:

    【解决方案3】:

    首先,让用户清楚您的期望。其次,测试输入以验证它是否包含您期望的边界内的数据。

    主要示例,我有一个带有电子邮件字段的表单。我们没有立即使用该数据,因此我们没有对其进行任何检查。结果:大约 1% 的用户输入了他们的家庭住址。该字段被标记为“电子邮件地址”显然用户只是在阅读第二个单词而忽略了第一个单词。

    解决方法是将标签更改为简单地说“电子邮件”,然后测试输入。对于踢球,我们继续记录用户最初在该字段中输入的内容,以查看标签更改是否有帮助。确实如此。

    此外,作为一般做法,您的函数应测试输入以验证它们是否包含您期望的数据。在您选择的语言中使用断言或其等效项。

    【讨论】:

      【解决方案4】:

      当我编码时,会有一些我期望的异常,即文件可能丢失,或者某些 xml 序列化可能会失败。我知道的那些异常会提前发生,我可以为它们处理。

      虽然有很多事情是你无法预料的,​​但你也不应该尝试。放入一个全局错误处理程序和记录器,以便最终捕获并记录所有内容。然后,当您的测试人员和/或用户发现导致异常的情况(即错误输入)时,您可以决定是否要专门针对它进行进一步处理,或者保持原样。

      总结:验证您的输入,但不要试图过多地注视水晶球,因为您永远无法预料到用户可能提出的每一个问题。拥有一个全局处理程序和记录器,然后根据需要进行优化。

      【讨论】:

      • 我真的很喜欢全局包罗万象的想法,以防万一最终出现一些奇怪的异常。
      【解决方案5】:
      【解决方案6】:

      您必须假设您的用户非常愚蠢。总会有人想办法给你一些你认为永远不会发生的意见。

      我尝试使我的异常抛出尽可能细化,以便在出现问题时提供最佳反馈。如果将所有内容放在一起,则无法确定是哪个错误案例导致了问题。

      我通常尝试先处理错误情况(在获取功能代码之前),但这不一定是最佳做法。

      【讨论】:

        【解决方案7】:

        有人已经提到defensive programming。不过,从用户体验的角度来看一些想法。

        • 如果用户的输入无效,则 (a) 如果您有理由确定您知道他们的意思,则更正它,或者 (b) 显示一条消息in line,告诉他们他们采取了哪些纠正措施应采取。
        • 避免出现“致命系统错误代码 02382981”之类的消息。用户 (a) 不知道这意味着什么,即使您知道,并且 (b) 看到这样的事情会感到害怕和推迟。
        • 避免出现每一个你能想到的——可怕的——可能的——错误的弹出消息。除非您绝对需要他们先解决问题,然后他们才能执行其他任何操作,否则您不应中断用户流程。
        • 日志,日志,日志。当您向用户显示错误消息时,将可能有助于您调试的相关信息放入 (a) 日志文件或 (b) 数据库中,具体取决于您正在创建的应用程序的类型。这将减轻查找有关错误信息的工作,而不会让用户哭泣。

        一旦您确定了用户应该做什么和不应该做什么,您就能够有效地编写错误处理代码。您可以使用辅助方法/类让自己更轻松。

        关于您关于在业务逻辑之前/之后/期间编写处理的问题,请这样想:如果您要制作 400,000 个三明治,同时添加所有芥末可能会更快,但可能也比单独制作每个三明治更无聊。不过,谁知道呢,也许你真的很喜欢芥末的味道……

        【讨论】:

        • 很公平。您可以在事后编写所有错误处理代码。 :)
        猜你喜欢
        • 2021-08-07
        • 2019-07-24
        • 1970-01-01
        • 1970-01-01
        • 2018-05-03
        • 2016-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多