C# 我自己抛出异常还是让clr抛出异常?

C# 我自己抛出异常还是让clr抛出异常?,c#,exception,exception-handling,coding-style,C#,Exception,Exception Handling,Coding Style,我目前正在做一个朋友项目,有很多课程,由不同的人编写。在阅读代码时,我意识到这些人在特殊情况下抛出异常时有不同的风格 只要说“开发者1”做到了: 他不检查索引,如果索引超出范围,CLR也会抛出一个IndexOutOfRangeException 当然,两种方法都会得到相同的结果,但是在性能或其他方面有什么不同吗?是否有建议何时使用? 我更喜欢第一种方法,因为它更易于维护。在我看来,第一种方法只是不需要代码,我在这里看不到任何维护收益。如果我们不想抛出自己的异常和一些额外的细节,这样的方法将是有用

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

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

他不检查索引,如果索引超出范围,CLR也会抛出一个IndexOutOfRangeException

当然,两种方法都会得到相同的结果,但是在性能或其他方面有什么不同吗?是否有建议何时使用?
我更喜欢第一种方法,因为它更易于维护。

在我看来,第一种方法只是不需要代码,我在这里看不到任何维护收益。如果我们不想抛出自己的异常和一些额外的细节,这样的方法将是有用的。但是,执行与CLR相同的检查以抛出相同的异常-毫无意义。

在我看来,第一种方法只是不必要的代码,在这里我看不到任何维护增益。如果我们不想抛出自己的异常和一些额外的细节,这样的方法将是有用的。但是,执行与CLR相同的检查以抛出相同的异常-毫无意义。

在我看来,第一种方法只是不必要的代码,在这里我看不到任何维护增益。如果我们不想抛出自己的异常和一些额外的细节,这样的方法将是有用的。但是,执行与CLR相同的检查以抛出相同的异常-毫无意义。

在我看来,第一种方法只是不必要的代码,在这里我看不到任何维护增益。如果我们不想抛出自己的异常和一些额外的细节,这样的方法将是有用的。但执行与CLR相同的检查以引发相同的异常-毫无意义。

从性能角度看,支持数组将已经在索引范围上运行检查,因此如果您自己执行检查,而无意在引发的异常中提供额外的详细信息,您只是在重复工作,这可能会以某种不明显的方式影响性能。您可以设置一个控制台应用程序,使用一个控制台来比较性能,并将每种样式运行数百万次并进行比较


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

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


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

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


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

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


如果不能保证支持的可枚举类型总是相同的,那么进行自己的检查并将自己抛出的潜在效用就是。正如Ron指出的,字典会抛出一些不同的东西,因此如果调用方只捕获IndexOutOfRangeException,但在本例中,可能您的索引器碰巧持有一个字典,那么如果您没有“规范化”,您就不会处理异常您可以自己抛出它。

堆栈在异常中会有所不同。“已处理”的堆栈将在
throw
站点停止,“未处理”的堆栈将显示您正在访问的集合的信息。它还取决于支持集合是什么,对于一个数组,它将抛出一个
indexootfboundsexception
,但是如果你正在访问一个字典,你将得到一个
KeyNotFoundException
。这可能是一个更好的问题,因为这不是一个特定的问题,而是关于代码设计的更多信息。@user1666620如果这是迁移给程序员的,它将作为@durron597关闭,这是绝对正确的。不管怎样,这都是一个糟糕的问题。堆栈在异常中会有所不同。“已处理”的堆栈将在
throw
站点停止,其中“未处理”的堆栈将
public string this[int index]
{
     get
     {
          if (index >= 0 && index < contents.Length)
              return contents[index];
          else
              throw new IndexOutOfRangeException();
      }
 }
public string this[int index]
{
     get
     {
          return contents[index];
     }
 }