什么是ArgumentException和Exception的区别?

7
在我们教授的示例代码中,有一段代码片段如下:
if (name == null || name == "")
    throw new ArgumentException("name is null or empty");

And another snippet that looks like this:

if (!File.Exists(name))
{
    throw new Exception("File does not exist!");
}

我只是想知道两者的区别以及为什么要使用其中之一

3个回答

8

Exception是所有异常的基类。ArgumentException用于表示参数无效,它从Exception派生而来。使用catch可以根据异常类型进行过滤,并分别处理每个异常。

MSDN对此有很好的描述:

当你需要抛出异常时,通常可以使用.NET Framework中的现有异常类型,而不是实现自定义异常。在以下两种情况下应使用标准异常类型: - 您正在抛出由使用错误引起的异常(即由调用您的方法的开发人员在程序逻辑中造成的错误)。通常,您将抛出诸如ArgumentException、ArgumentNullException、InvalidOperationException或NotSupportedException等异常。在实例化异常对象时所提供给异常对象构造函数的字符串应描述错误,以便开发人员可以修复它。有关更多信息,请参阅Message属性。 - 您正在处理可以通过现有.NET Framework异常向调用者传达的错误。您应该尽可能抛出最具体的异常。例如,如果一个方法要求参数是枚举类型的有效成员,则应该抛出InvalidEnumArgumentException(最具体的类),而不是ArgumentException。

3

Exception是一个基类,它是最通用的异常类型。在许多情况下,可以使用更具体的类型来提供有关发生的错误类型的更多信息。在这种情况下,ArgumentException是一种异常类型,表示参数存在错误。

简而言之:ArgumentException是一种Exception类型,用于提供更详细的信息。


2

对象是万物之根。

对象有许多子类型,其中之一就是异常(Exception)。

异常也有许多子类型,其中之一是系统异常(SystemException)。

系统异常也有许多子类型,其中之一是参数异常(ArgumentException)。

参数异常又有许多子类型,其中包括空引用异常(ArgumentNullException)和超出范围异常(ArgumentOutOfRangeException)。

如果您的教授真的想使用最明确的异常,他们本可以写成:

if (name==null) throw new ArgumentNullException("name");
if (name=="") throw new ArgumentOutOfRangeException("name", name, "name cannot be zero length");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接