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

use*_*049 3 .net c# exception-handling

在.net中,c#

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

这个问题是c#的重复,是否存在异常概述

Dan*_*Tao 10

Jason提供链接非常全面,但它中的许多异常类型(例如NullReferenceException或者IndexOutOfRangeException)实际上只是被框架抛出; 对于你来说,开发人员明确地抛出它们是不合适的.

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

ArgumentNullException

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

ArgumentOutOfRangeException

将值提供给超出对该方法有意义的范围的方法.

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

if (x < 1)
{
    throw new ArgumentOutOfRangeException("x");
}
Run Code Online (Sandbox Code Playgroud)

常见.

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Jas*_*ans 6

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

创建自己的自定义异常有哪些最佳做法?