如何知道何时使用现有异常或编写自定义异常?
-
13-09-2019 - |
题
感谢您的输入 这个问题, ,我决定使用我的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
{
}
}
我怎么知道要使用哪个例外类?
在上面的实例中,我创建了自己的例外使用它等。选择我的异常类型似乎总是如此 随意的 流程,因此创建自己似乎是最好的主意。
还是我错过了例外的东西?决定使用哪种异常类型的其他含义?
解决方案
如果无法创建对象的原因是因为创建参数是无效的,那么您可能应该扔一个 ArgumentException
. 。但是,您总是可以创建我们自己的班级 ArgumentException
如果您真的希望能够分别处理这种例外。 (你确定你要?)
其他提示
为什么创建自定义异常? 很好地说明了为什么以及何时使用自定义异常。
创建一种新类型时,可以捕获并了解发生特定的特殊情况时可能有用。知道没有找到文件而不是通用的io例外吗?
写了一篇有关此主题的整个博客文章,您可能会发现有趣的
总而言之,除非您实际上希望某人同时捕捉并采取行动,否则请勿编写自定义异常类。
我认为找到现有例外的好地方将是在帮助文件中...如果您查找帮助 Exception
类,概述页面上应该有一个派生类列表。
如何决定是否创建一个新的(源自 Exception
),或从现有的继承来取决于例外的含义。
正如乔恩(Jon)所说,如果您的代码对参数进行了一些验证 Create
方法,您可能想制作一个异常 ArgumentException
(例如,也许 ArgumentNonExistentEntityException
如果指定的ID不存在,尽管这有点满是嘴巴)。
如果您正在创建的异常不会从概念上从已经存在的异常中“继承”其含义,则只是为您的库创建一个新的含义。
您将创建一个自定义异常类型,以提供更多的上下文信息或含义为错误,否则您将依靠生成的运行时类型类型。例如,当System.DivideByZero异常时,当它在应用程序中升至顶部时,异常可能并不明显。取而代之的是,您可以创建一个自定义异常,以提供以上“ DivideByZero”错误之外提供更多上下文信息。
有关不同运行时生成的异常的参考,请查看MSDN的系统名称空间。这不是详尽的列表,因为本机代码和第三方库可以生成异常。