抛出异常自己或让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抛出同样的异常时做同样的检查——完全没有意义。
性能方面,后备数组已经对索引范围进行了检查,所以如果您自己执行检查而不打算在抛出的异常中提供额外的细节,那么您只是在重复工作,这将以某种可能不明显的方式影响性能。你可以设置一个控制台应用程序来使用秒表比较性能,并运行每个样式几百万次并比较次数。
如果支持的可枚举类型不能保证总是相同的,那么自己进行检查并抛出自己的潜在效用将是。正如Ron所指出的,Dictionary会抛出一些不同的东西,所以如果调用者只捕获IndexOutOfRangeException,但在这种情况下,可能您的索引器碰巧持有Dictionary,如果您不通过自己抛出它来"规范化"它,您将无法处理异常。