【问题标题】:Throw exception on my own or let the clr throw? [closed]自己抛出异常还是让 clr 抛出? [关闭]
【发布时间】:2015-08-05 15:12:56
【问题描述】:

我目前正在处理一个由不同人编写的包含很多课程的朋友项目。在阅读代码时,我意识到这些人在特殊情况下抛出异常的方式不同。

只要说“开发者 1”做了:

public string this[int index]
{
     get
     {
          if (index >= 0 && index < contents.Length)
              return contents[index];
          else
              throw new IndexOutOfRangeException();
      }
 }

他检查索引,如果索引超出范围则抛出异常。

“开发者 2”改为:

public string this[int index]
{
     get
     {
          return contents[index];
     }
 }

他不检查索引,如果索引超出范围,则让 CLR 抛出 IndexOutOfRangeException。

当然,两种方式都给出了相同的结果,但是在性能或其他方面有什么不同吗?还有什么时候使用的建议吗? 我更喜欢第一种方式,因为它更容易维护..

【问题讨论】:

  • 堆栈将在异常中有所不同。 “已处理”的将在throw 站点停止堆栈,“未处理”的将显示有关您正在访问的集合的信息。它还取决于支持集合是什么,对于一个数组,它会抛出一个IndexOutOfBoundsException,但如果你正在访问一个字典,你会得到一个KeyNotFoundException
  • 这可能在programmers.stackexchange.com 上问得更好,因为这不是一个具体问题,而是更多关于代码设计的问题。
  • @user1666620 如果将其迁移给程序员,它将被关闭为duplicate of this question
  • @durron597 绝对正确,正确。无论哪种方式,这都是一个糟糕的问题。

标签: c# exception exception-handling coding-style


【解决方案1】:

在我看来,第一种方式只是不必要的代码,我在这里看不到任何维护收益。如果我们不想用一些额外的细节抛出我们自己的异常,这种方式会很有用。但是进行与 CLR 相同的检查以引发相同的异常 - 完全没有意义。

【讨论】:

    【解决方案2】:

    就性能而言,后备数组已经对索引范围进行了检查,因此,如果您自己执行此操作而不打算在抛出的异常中提供额外的详细信息,那么您只是在重复工作,这会影响某些情况下的性能可能不引人注意的方式。您可以设置一个控制台应用程序以使用 Stopwatch 比较性能,然后将每种样式运行几百万次并比较时间。

    如果不能保证支持的可枚举类型始终相同,则进行自己的检查并自行处理的潜在用途是。正如 Ron 指出的那样,字典会抛出一些不同的东西,所以如果调用者有一个只针对 IndexOutOfRangeException 的捕获,但在这种情况下,也许你的索引器碰巧持有字典,如果你没有处理,你就不会处理异常“通过自己扔来标准化”它。

    【讨论】:

      猜你喜欢
      • 2013-06-13
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多