如何知道何时使用现有的Exception或编写自定义异常?

时间:2009-06-10 13:55:48

标签: c# exception custom-exceptions

感谢this question上的输入,我决定使用我的Create()方法抛出异常,这样Jon Skeet说,你不必处理它们无处不在,可以让它们冒出来,似乎是大型应用程序的最佳方法。

现在我用这段代码创建我的类的实例:

try
{
    SmartForms smartForms = SmartForms.Create("ball");
    smartForms.Show();
}
catch (CannotInstantiateException ex)
{
    Console.WriteLine("Item could not be instantiated: {0}", ex.Message);
}

自定义例外:

using System;

namespace TestFactory234.Exceptions
{
    class CannotInstantiateException : Exception
    {

    }
}

我如何知道要使用哪个Exception类?

在上面的例子中,我创建了自己的Exception,因为我不知道从哪里获取“所有系统异常”列表,或者是否存在“无法实例化对象”或者是否有使用它等一些其他意义。选择一个异常类型对我来说似乎总是这样一个任意过程,所以创建我自己似乎是最好的想法。

或者我错过了一些关于异常的内容?决定使用哪种Exception类型还涉及哪些其他含义?

6 个答案:

答案 0 :(得分:5)

如果您无法创建对象的原因是因为Create的参数无效,您应该抛出ArgumentException。但是,如果您真的希望能够将这种异常分别处理给其他人,则可以始终创建自己的派生自ArgumentException的类。 (你确定要吗?)

答案 1 :(得分:3)

Why Create Custom Exceptions?非常详细地解释了为什么以及何时使用自定义例外。

答案 2 :(得分:2)

创建一个新类型,以便能够捕获并了解发生的特定异常情况。知道找不到文件而不是通用IO异常是否有用?。

答案 3 :(得分:2)

写了一篇关于这个主题的完整博文,你可能会感兴趣

总之,不要编写自定义异常类,除非您实际上希望某人同时捕获并对该类型采取行动。

答案 4 :(得分:0)

我认为查找现有异常的好地方是在帮助文件中...如果查找Exception类的帮助,概述页面上应该有一个派生类列表。 / p>

如何决定是创建新的(从Exception派生)还是从现有的继承取决于异常的含义。

正如Jon所说,如果您的代码对Create方法的参数进行了一些验证,您可能希望从ArgumentException派生一个异常(例如,如果ArgumentNonExistentEntityException可能是{{1}}指定的ID不存在,虽然有点满口。)

如果您创建的异常在概念上没有从已经存在的异常中“继承”其含义,那么只需为您的库创建一个新的异常。

答案 5 :(得分:0)

您将创建自定义异常类型以向错误提供更多上下文信息或含义,否则您将依赖于运行时生成的异常类型。例如,当System.DivideByZero异常在应用程序中冒泡到顶部时,可能并不明显。相反,除了上述“DivideByZero”错误之外,您还可以创建自定义例外以提供更多上下文信息。

有关不同运行时生成的异常的参考,请查看MSDN的系统命名空间。这不是一个详尽的列表,因为异常可以由本机代码以及第三方库生成。