【问题标题】:Catch exception, validate input or both?捕获异常,验证输入还是两者兼而有之?
【发布时间】:2011-06-03 13:03:17
【问题描述】:

我正在努力获取这样的 RSS 提要:

SyndicationFeed rss = SyndicationFeed.Load(XmlReader.Create(textBox1.Text));

XmlReader.Create() 在这种情况下最多可以抛出 4 个与参数为空、404 错误等相关的异常。

我应该在调用该行之前尝试验证 Uri(确保它不是 null、404、正确的文档类型等)还是应该只处理异常?我知道我已经读过很多次关于 SO 的内容,异常应该用于真正的特殊情况,我同意这似乎不符合该先决条件,但处理异常似乎更容易。

【问题讨论】:

    标签: c# .net exception-handling validation


    【解决方案1】:

    复选框的Text 属性永远不会为空,因此您可以跳过该属性。手动检查所有简单且与流程无关的情况,例如字符串为空且 URL 正确,并将更多模糊的 XML 特定内容留给Create 方法内的验证。所以答案是两者结合。

    另外,让我再次参考 Eric Lippert 关于异常的blog post。在您的情况下,令人烦恼和外生的异常都可能发生,因此您可能应该抓住它们。但请确保不会发生愚蠢的事情。

    【讨论】:

      【解决方案2】:

      由于阅读器和联合提要解释器将验证输入,因此确实没有必要重复这项工作。尤其如此,因为——要正确地这样做——你必须接受或拒绝完全相同的文件。这将是疯狂的代码重复。

      我建议只处理异常。

      【讨论】:

        【解决方案3】:

        我期待看到其他人在这里说什么,但在我看来,您应该执行您知道可以准确执行的验证类型:检查空 URI、检查完全空的 URI 等. 除此之外,让 Create 调用处理验证并捕获异常。我猜该函数的编写者知道如何比你更彻底地验证它(无意冒犯!)。

        【讨论】:

          【解决方案4】:

          虽然我不是最佳实践专家,但我确实相信例外应该是例外(是的......)这不仅是哲学上的事情,也是实际的事情。大多数时候,异常处理的性能成本高于检查异常原因。

          如果我想成为哲学,我会说“如果你对这个问题无能为力,就不要试图处理它。”例如,如果您想在文件中写入内容,检查文件是否存在、文件权限等可能会很麻烦,而且如果您无法访问网络驱动器,您也无能为力。如果您发现“验证文件是否存在并且您具有适当的权限。”的异常,您可以为自己省去很多麻烦。

          【讨论】:

            猜你喜欢
            • 2014-07-20
            • 1970-01-01
            • 2015-08-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-09-22
            • 2010-10-20
            • 2013-01-24
            相关资源
            最近更新 更多