已存在哪些异常类以及何时使用它们?

时间:2010-08-18 08:03:23

标签: c# .net exception-handling

在.net,c#

已存在许多Exception子类, 它们是什么,何时使用它们而不是创建我们自己的子类?

此问题与c# is there an exception overview

重复

3 个答案:

答案 0 :(得分:10)

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

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

ArgumentNullException

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

ArgumentOutOfRangeException

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

实施例

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

if (x < 1)
{
    throw new ArgumentOutOfRangeException("x");
}

很常见。

FormatException

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

InvalidOperationException

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

实施例

当他们枚举的集合被修改时,许多IEnumerator<T>个实现会抛出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
    }
}

显然这只是我自己的个人(和主观)名单;但我认为它可能会让你知道你可以在你自己的代码中利用什么样的例外。

答案 1 :(得分:6)

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

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

答案 2 :(得分:-1)

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

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