link provided by Jason 非常全面,但是其中的许多异常类型(例如NullReferenceException 或IndexOutOfRangeException)实际上只是由框架抛出的;如果您是开发人员,明确抛出它们不太合适。
在我看来,以下是一些对开发人员最有用的异常类型。
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
}
}
显然,这只是我自己的个人(和主观)清单;但我认为它可能会让您了解可以并且应该在自己的代码中利用哪些类型的异常。