2011-07-18 50 views
1

以下例外情况可能是非常相似:我应该处理/处理这些异常吗?

  • ArgumentException
  • ArgumentNullException
  • InvalidOperationException
  • ObjectDisposedException

    1. 我应该扔在我的代码?
    2. 我应该追上他们?
    3. InvalidOperationException是一个非常模糊的和广泛的例外,因为它意味着一个方法试图东西是不可能的,由于状态(例如启动一个双赢SVC这可能不是启动的)。
+0

是否有可能您的代码会抛出这些异常?如果是的话就抓住他们。一些代码会很有用 – skyfoot

+0

除非你期待他们,并且你知道*特别是*如何处理他们,否则不要捕捉任何异常。如果不是,不要抓住它们。让他们泡上堆栈。这是他们设计的目的。并且没有什么时候你应该捕获ObjectDisposedException。这表明您的程序中存在一个错误;你想解决这个问题,而不是抓住它。 –

回答

1

这一切都取决于你在做什么。除了ObjectDisposedException,这是你应该留给运行时间的东西,所有这些都可以接受,以适当的情况。

你希望其中的一些通过各种手段再发生,抓住他们,并适当地处理这种情况。

2

作为一般规则,你应该抛出的最具体的异常就可以了。这为消费者提供了处理/理解异常的最佳机会。

因此,例如,

  • 掷ArgumnetNullException,当arg是空掷
  • ArgumentOutofRange异常时arg是超出范围的
  • ArgumentException的是arg是某些其他原因无效。

InvalidOperationException是相当宽泛的,并且在更多特定选项不适合时经常用作catchall。

1

大部分的自制方法的参数验证(通常命名为喜欢的后卫,参数,等等)都在参数无效的情况下抛出这些异常:

  • 的ArgumentException - 当方法参数错误
  • ArgumentNullException - 当方法参数为null

我相信MSDN有何时抛出这样的例外非常详细的描述,

ArgumentException在调用方法时被抛出,并且至少有一个 传递的参数不符合被调用方法的参数说明 。的ArgumentException的所有实例应进行描述无效参数一个 有意义的错误消息,以及用于 参数值的预期范围。

ArgumentNullException当一个方法被调用并且至少有一个 传递参数为空,但不应该为空。

InvalidOperationException异常在的情况下使用时的失败调用 一个方法是由比无效的参数等原因引起的。对于 例如,InvalidOperationException异常是通过抛出:

  • 的MoveNext如果一个集合中的对象创建 枚举之后被修改。
  • GetString如果在方法调用之前关闭资源集是 。