【问题标题】:What exception classes already exist and when do we use them?哪些异常类已经存在,我们什么时候使用它们?
【发布时间】:2010-08-18 08:03:22
【问题描述】:

在.net,c#中

已经有很多 Exception 的子类, 它们是什么,我们什么时候使用它们而不是创建我们自己的子类?

这个问题与c# is there an exception overview重复

【问题讨论】:

  • 何时使用,请在文档中查找它们(或您最喜欢的带有文档集成的 IDE),例如here 用于 IOORE:“尝试访问具有超出数组边界的索引的数组元素时引发的异常。无法继承此类。”
  • +1 @Jesse C. Slicer,如果可以的话,我会结束这个问题,谢谢

标签: c# .net exception-handling


【解决方案1】:

link provided by Jason 非常全面,但是其中的许多异常类型(例如NullReferenceExceptionIndexOutOfRangeException)实际上只是由框架抛出的;如果您是开发人员,明确抛出它们不太合适。

在我看来,以下是一些对开发人员最有用的异常类型。

ArgumentNullException

这很明显:传递给方法的参数之一是 null,但对于这个特定的方法,该参数的 null 值是不允许的。

ArgumentOutOfRangeException

为方法提供的值超出了对该方法有意义的范围。

示例

在大多数采用表示幅度或长度的参数的方法中,只有正值对该参数有意义。所以像

这样的支票
if (x < 1)
{
    throw new ArgumentOutOfRangeException("x");
}

很常见。

FormatException

当您编写自己的自定义文本解析方法,或者实际上是任何期望字符串匹配特定格式的代码,并且提供了一些代码无法理解的输入时,这是一个非常合理的选择。

InvalidOperationException

每当我不确定还可以使用什么时,我倾向于经常使用这个(实际上可能是过度使用它)。一般来说,我认为这种类型表示客户端试图做一些非法的事情,原因与当前的类或方法有关。

示例

当他们枚举的集合被修改时,许多IEnumerator&lt;T&gt; 实现会抛出InvalidOperationException。这是一个合理的设计选择,因为设计一个不处理这种情况的集合类比设计一个处理这种情况的集合类要容易得多。

NotSupportedException

这通常适用于派生自某个基类并且仅提供该基类的abstract 成员的部分实现的类。

示例

一些开发人员选择编写具有“可选”功能的基类,这些功能可能由派生类提供,也可能不提供。下面是一个例子:

abstract class Animal : Organism
{
    public virtual bool EatsPlants
    {
        get { return false; }
    }

    public virtual void EatPlant(Plant food)
    {
        throw new NotSupportedException();
    }

    public virtual bool EatsAnimals
    {
        get { return false; }
    }

    public virtual void EatAnimal(Animal food)
    {
        throw new NotSupportedException();
    }
}

class Herbivore : Animal
{
    public override bool EatsPlants
    {
        get { return true; }
    }

    public override void EatPlant(Plant food)
    {
        // whatever
    }
}

显然,这只是我自己的个人(和主观)清单;但我认为它可能会让您了解可以并且应该在自己的代码中利用哪些类型的异常。

【讨论】:

    【解决方案2】:

    Here 是常见异常类型的列表。如果您想知道何时创建自己的异常,请尝试:

    What are some best practices for creating my own custom exception?

    【讨论】:

    【解决方案3】:

    对于 Exception 的子类列表,我建议您使用 .NET Reflector。

    http://www.red-gate.com/products/reflector/

    【讨论】:

      猜你喜欢
      • 2011-11-14
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 2021-10-02
      相关资源
      最近更新 更多