3

何时应该创建自己的自定义异常类而不是使用 .Net 提供的异常类?

我应该从哪个基异常类派生,为什么?

4

6 回答 6

6

为什么要创建自己的异常?

您创建自己的异常,以便在抛出它们时可以有特定的捕获,从而将它们与系统抛出的(未处理的)异常区分开来。

你应该从哪个类派生它?

早些时候,自定义异常从ApplicationException类派生是标准做法,但随着时间的推移,MS 建议已经改变,鼓励开发人员从类派生System.Exception而不是从类派生ApplicationException

于 2010-09-17T02:31:58.577 回答
2

异常处理的目标应该是清楚地了解出了什么问题。因此,只要提供的异常不能提供清晰的理解,您就应该定义自己的异常。

例如,我正在编写一个将阿拉伯数字转换为罗马数字的应用程序。此应用程序中的一个约束条件是罗马数字必须在 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

于 2010-09-17T02:31:48.733 回答
2

这可能看起来有点明显,但是当没有内置异常有意义时,您应该创建一个异常。通常我会为我正在处理的库定义一个基本异常。

public class MyLibraryException : Exception
{
    // .....
}

然后我会为使用该库时可能出现的情况创建一个例外。

public class SomethingHorribleException : MyLibraryException 
{
    // .....
}

然后客户总是可以知道我的库会抛出一些继承的东西MyLibraryException

于 2010-09-17T02:35:47.163 回答
1

创建自己的异常的一个原因是能够隔离它们以进行捕获。例如:

try {
// do stuff
} catch (MyCustomException e) {
// handle this known exception
}

所有其他异常都可以冒泡并在另一个级别进行处理。

于 2010-09-17T02:28:29.243 回答
1

到目前为止的答案看起来都不错,但我还要补充一点:

隐藏可能因为您需要处理这些异常而暴露的实现细节。

例如,您不希望您的 UI 捕获 SQLException。您应该从数据访问代码中抛出自己的异常,并让您的 UI 处理这些异常。如果您更改为非数据库提供程序进行数据存储(例如 XML、文件系统等),则无需更改 UI 代码。

但是,只有在我的 UI 代码中明确地处理它们时,我才会这样做。

于 2010-09-17T02:53:48.913 回答
0

如果我想向其中添加其他属性,例如变量、位置、用户名、返回的记录数等,我会创建自己的 excpetion 类。

基本上我会创建一个类来缩小错误是什么以及如何重新创建它。

编辑

哦,您可以将验证错误添加到可以传递给前端以显示错误的异常类中。

于 2010-09-17T02:29:38.133 回答