感谢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类型还涉及哪些其他含义?
答案 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的系统命名空间。这不是一个详尽的列表,因为异常可以由本机代码以及第三方库生成。