我应该处理/捕获这些例外吗?

时间:2011-07-18 09:37:58

标签: c# exception-handling

以下例外可能非常相似:

  • ArgumentException
  • ArgumentNullException
  • InvalidOperationException
  • ObjectDisposedException

    1. 我应该把它们扔进我的代码吗?
    2. 我应该抓住它们吗?
    3. InvalidOperationException是一个非常模糊和广泛的例外,因为它意味着一种方法尝试一些因状态而无法实现的东西(例如,启动一个可能无法启动的win svc)。

3 个答案:

答案 0 :(得分:2)

作为一般规则,您应该尽可能地抛出最具体的例外。这为消费者提供了处理/理解异常的最佳机会。

例如,

  • 抛出ArgumnetNullException,当arg为null时抛出
  • 当arg超出范围时的ArgumentOutofRange异常
  • ArgumentException是因某些其他原因导致arg无效。

InvalidOperationException非常广泛,并且在更多特定选项不适合时常用作捕获。

答案 1 :(得分:1)

这完全取决于你在做什么。除了ObjectDisposedException之外,这是你应该留给运行时的东西,所有这些都可以在适当的情况下抛出。

你是否期望通过各种方式发生其中一些,抓住它们并适当地处理这种情况。

答案 2 :(得分:1)

大多数自制的方法参数验证器(通常命名为Guard,Arguments等等)在无效参数的情况下抛出这些异常:

  • ArgumentException - 当method参数错误时
  • ArgumentNullException - 当method参数为null时

我相信MSDN有关于何时抛出此类异常的详细描述,

  调用方法且至少有一个方法时,抛出

ArgumentException   传递的参数不符合参数规范   被叫方法。 ArgumentException的所有实例都应该带有   描述无效参数的有意义的错误消息,以及   参数的预期值范围。

     调用方法并且至少有一个方法时,抛出

ArgumentNullException   传递的参数为null但不应该为null。

     

InvalidOperationException 用于无法调用的情况   方法是由无效参数以外的原因引起的。对于   例如,抛出InvalidOperationException:

     
      
  • MoveNext如果在之后修改了集合的对象   枚举器已创建。
  •   
  • 如果资源集在方法调用之前关闭,则为GetString   制成。
  •