抛出异常自己或让clr抛出

本文关键字:clr 抛出 自己 抛出异常 | 更新日期: 2023-09-27 18:06:42

我目前正在做一个朋友的项目,里面有很多由不同的人写的类。在阅读代码时,我意识到这些人在特殊情况下抛出异常的风格不同。

就说"developer 1"做了:

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

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

"Developer 2"代替了:

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

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

当然,两种方法都得到相同的结果,但是在性能上有什么不同吗?还有,在什么时候使用哪一个有什么建议吗?我更喜欢第一种方法,因为它更容易维护。

抛出异常自己或让clr抛出

在我看来,第一种方法只是不必要的代码,我在这里看不到任何维护收益。如果我们不想抛出带有一些额外细节的异常,这种方式将非常有用。但是和CLR抛出同样的异常时做同样的检查——完全没有意义。

性能方面,后备数组已经对索引范围进行了检查,所以如果您自己执行检查而不打算在抛出的异常中提供额外的细节,那么您只是在重复工作,这将以某种可能不明显的方式影响性能。你可以设置一个控制台应用程序来使用秒表比较性能,并运行每个样式几百万次并比较次数。

如果支持的可枚举类型不能保证总是相同的,那么自己进行检查并抛出自己的潜在效用将是。正如Ron所指出的,Dictionary会抛出一些不同的东西,所以如果调用者只捕获IndexOutOfRangeException,但在这种情况下,可能您的索引器碰巧持有Dictionary,如果您不通过自己抛出它来"规范化"它,您将无法处理异常。