2013-02-20 115 views
5

用于方括号的C#引用表示:方括号[]用于数组,索引器和属性。它们也可以用于指针。 (它也表示,对于数组)如果数组索引超出范围,则会引发异常。如何确定“x []”可能抛出哪些异常?

所以,当你在数组以外使用方括号时,你怎么知道可能会抛出什么异常呢?

对于字典,如果你使用的访问方法,如Dictionary.TryGetValue您可以轻松地查找,该方法可能会抛出异常(例如),但C# reference for square brackets []只是说,它可能会抛出异常的指数超出范围的数组。

所以,如果你想用方括号的一些数据类型,在哪里可以查找哪些异常可能抛出该数据类型?

我试着访问一个不存在的字典成员,只是为了看看会发生什么,并且我得到了KeyNotFoundException。我知道你也可以得到NullReferenceException。这在哪里记录?什么是完整列表?

+1

你为什么需要一个列表?一个普通的'catch(Exception ex)'不起作用吗? – DiskJunky 2013-02-20 22:44:06

+1

@DiskJunky,捕捉泛型异常是一种最糟糕的做法(除非在最高级别时可能会记录它并仍然弹出)。 – 2013-02-20 22:45:08

+0

@pst同意,因为它可以超载,你可以实现你自己的索引实现,并抛出你喜欢的任何地狱:) – RobJohnson 2013-02-20 22:45:23

回答

4

每个实现都记录在案。没有详尽的列表,因为运营商可能会超载,所以可能会引发任何异常。操作员通常记录为Item属性。

下面是具体的用途一些文档:

Dictionary.Item

Array.Item

然而,你不应该需要一个详尽的清单上有什么可能被抛出。异常通常抓到两个原因:要么你想(捕获异常是搭上了错误的日期格式,最简单的方法时,像天TryParse前)做一些事情,或者你只是想说明一个异常发生并记录下来,在这种情况下,您通常会重新审查实际的异常。

捕获特定的异常对前一种情况是有益的。例如,如果你赶上NullReferenceException它通常重新抛出不同的异常,说明引用为null(因为这不是股票NullReferenceException)的一部分。

在后一种情况下,接住一个通用Exception是罚款如果你只是想记录和再掷因为有可能没有别的当[] Operator应用于词典< TKEY的,TValue >或列表<牛逼>你可以做些什么。

+0

谢谢 - 我实际上并不想知道为了了解所有内容而会抛出什么*。我只是想知道什么是有效的,所以我可以想象我是否想要处理它。案例和观点:在我的问题中,我说Dictionary可能会抛出NullReferenceException,但事实证明,当您查看Item属性时,它实际上可能会抛出ArgumentNullException。因此,如果我编写代码来捕获NullReferenceException,我想我正在覆盖我的轨道,但我实际上是在愚蠢地编写垃圾代码。 – 2013-02-21 03:01:36

+0

@EdwardNedHarvey - 好吧,“垃圾”很强。如果你只是捕获'NullReferenceException'并且抛出一个'ArgumentNullException',那么所有将发生的异常都会被你的代码或者框架代码捕获到更高的堆栈。 – 2013-02-21 13:37:12

+0

@D斯坦利的观点是,在没有查找可能抛出的实际异常的情况下,我倾向于编写代码,认为我正在捕捉一个我没有捕捉到的异常。然后当我调试它时,我会看到它抛出了“Null”异常,但它没有捕获到“Null”异常,但是代码说要捕获“Null”,直到我绕着圆圈旋转,最后发现有多余一种不同类型的“空”异常。是的,那将是垃圾代码。比垃圾糟糕。我很高兴现在能够回答这个问题,所以我不会犯这个错误,而且我可以搜索我已经做到的地方。 – 2013-02-21 21:06:33

1

一般来说,方括号基本上让你访问一个索引属性 - 所以无论错误发生在您使用对象的属性索引提及。

对于数组,它可能是索引超出范围,对于DataRow,可能是列未找到等等。

4

,它调用该实例的indexer。索引器是一个特殊的属性,带有参数并且是通常称为Item

1

当用于访问数组,它可以抛出一个IndexOutOfRangeException

当用于某个属性时,它不能抛出任何异常,因为在编译时会出现任何错误。

当用于访问索引器时,它可以抛出任何异常。索引器可以以任何你想要的方式实现,并抛出任何它喜欢的异常。