【问题标题】:C# - Is there any additional advantage to throw an exception immediately after input argument validations in the methodC# - 在方法中的输入参数验证后立即引发异常是否有任何额外的优势
【发布时间】:2017-07-18 05:09:14
【问题描述】:

我了解下面的 GetInfo1 方法提供了更好的可读性。但是以下两种方法之间是否还有其他区别(例如运行时执行),即与方法结束相比,在方法开始时立即抛出异常?

public string GetInfo1(string name) {
        if(string.IsNullOrWhiteSpace(name))
            throw new ArgumentException(nameof(name));

        var info = GetInfoByName(name);
        return info;
    }

public string GetInfo2(string name) {
        if(!string.IsNullOrWhiteSpace(name)) {
            var info = GetInfoByName(name);
            return info;
        }
        throw new ArgumentException(nameof(name));
    }

【问题讨论】:

  • 请注意,为非空参数抛出 ArgumentNullException 是一种非常糟糕的形式。如果我打电话给GetInfo1(""),我可能会期待ArgumentException,但不会期待ArgumentNullException
  • 同意@JonSkeet,但添加了伪代码只是好奇地发现了差异。我会更新它。谢谢

标签: c# validation exception methods arguments


【解决方案1】:

我认为 GetInfo1 方法更灵活,可提供更好的可扩展性。您可以添加代码(更多 if 语句)来验证更多案例而不删除任何内容。

我的意思是一般。如果您只想检查 null 或空格,并且确定将来不会验证更多案例,那么这两种方法都可以。

另外,请记住,应在特殊情况下使用异常。用户忘记填写字段或错误输入空格是很常见的。

【讨论】:

    【解决方案2】:

    从头开始意味着您在对所有信息进行任何操作之前验证所有信息。这也意味着不需要运行不需要的代码。

    如果您在开始时检查所有内容,这也比使用大量 if 语句检查值更整洁(当您最终可能嵌套大量 if 时,这尤其有效)。

    同样值得注意的是,像 Resharper 这样的东西会建议你尽快退出一个方法。因此,就建议的最佳实践而言,GetInfo1 是推荐的方式。

    所以,简而言之,一开始就退出更好,因为:

    1. 更具可读性
    2. 它遵循建议的最佳做法
    3. 在整个方法中避免大量不必要的 if 语句
    4. 不需要运行的代码不会运行。

    【讨论】:

    • 我相信提前退出会更容易推理代码。
    • @CallumLinington 我没有在我的帖子中提到这一点,因为他已经说过他知道它更具可读性,但为了清楚起见,我已经添加了它。
    • @webnoob 我想即使在 GetInfo2 的情况下 if 块内部的代码也不会运行,因为 if 条件将评估为 false 但只是 throw 语句位于 n 个语句之后。
    • @SivaramK 你是对的,但这是一个非常简单的案例。大多数示例会更复杂,需要检查的数据更多,在这种情况下很快就会变得混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2012-04-23
    • 1970-01-01
    • 2013-02-05
    相关资源
    最近更新 更多