何时应该创建自己的自定义异常类而不是使用 .Net 提供的异常类?
我应该从哪个基异常类派生,为什么?
为什么要创建自己的异常?
您创建自己的异常,以便在抛出它们时可以有特定的捕获,从而将它们与系统抛出的(未处理的)异常区分开来。
你应该从哪个类派生它?
早些时候,自定义异常从ApplicationException
类派生是标准做法,但随着时间的推移,MS 建议已经改变,鼓励开发人员从类派生System.Exception
而不是从类派生ApplicationException
异常处理的目标应该是清楚地了解出了什么问题。因此,只要提供的异常不能提供清晰的理解,您就应该定义自己的异常。
例如,我正在编写一个将阿拉伯数字转换为罗马数字的应用程序。此应用程序中的一个约束条件是罗马数字必须在 0 < x < 4000 范围内。
private string ToRoman(int number)
{
if (number > 0 && number < 4000)
{
//ConvertHere
}
else
{
//Custom exception used for readability purposes.
throw new NumeralOutOfRangeException();
}
}
至于使用哪个基类,微软建议用户定义异常子类 Exception。(http://msdn.microsoft.com/en-us/library/seyhszts.aspx)
这可能看起来有点明显,但是当没有内置异常有意义时,您应该创建一个异常。通常我会为我正在处理的库定义一个基本异常。
public class MyLibraryException : Exception
{
// .....
}
然后我会为使用该库时可能出现的情况创建一个例外。
public class SomethingHorribleException : MyLibraryException
{
// .....
}
然后客户总是可以知道我的库会抛出一些继承的东西MyLibraryException
。
创建自己的异常的一个原因是能够隔离它们以进行捕获。例如:
try {
// do stuff
} catch (MyCustomException e) {
// handle this known exception
}
所有其他异常都可以冒泡并在另一个级别进行处理。
到目前为止的答案看起来都不错,但我还要补充一点:
隐藏可能因为您需要处理这些异常而暴露的实现细节。
例如,您不希望您的 UI 捕获 SQLException。您应该从数据访问代码中抛出自己的异常,并让您的 UI 处理这些异常。如果您更改为非数据库提供程序进行数据存储(例如 XML、文件系统等),则无需更改 UI 代码。
但是,只有在我的 UI 代码中明确地处理它们时,我才会这样做。
如果我想向其中添加其他属性,例如变量、位置、用户名、返回的记录数等,我会创建自己的 excpetion 类。
基本上我会创建一个类来缩小错误是什么以及如何重新创建它。
编辑
哦,您可以将验证错误添加到可以传递给前端以显示错误的异常类中。