我不知道我们可以用自定义异常做什么,我们用内置异常做什么。这似乎是一个天真的问题,但我真的不知道这一点。 你觉得怎么样?
答案 0 :(得分:11)
不同类型的异常的原因是允许您能够使用处理程序捕获您想要的那些,让其他人继续处理堆栈。因此,您可以根据异常的类型安排捕获某些偶尔预期情况的异常。
实际上,您可能根本不需要经常创建自己的。但是如果你这样做,那将是因为你需要能够抛出并捕获比可用的更具体的异常类型,并且可能附加了附加信息。
答案 1 :(得分:8)
在以下情况下创建自定义异常非常有用:
但通常如果框架中已经存在可以使用的异常,则最好使用它而不是为同一事物创建自己的异常。
答案 2 :(得分:6)
您可以使用它来实现与应用程序相关的特殊错误处理。假设您构建了一个香蕉应用程序,那么您可以拥有OutOfBananasException
。如果您的应用程序没有香蕉,您可以抛出异常并在以后通过特殊错误处理捕获它。
try
{
EatBananas();
}
catch(OutOfBananasException oobe)
{
GetMoreBananas();
}
catch(Exception e)
{
TellUserAndAbort();
}
修改强>
使用您自己的异常而不是内置的原因是为了让每个人都清楚地阅读您的代码或使用您的库发生了什么类型的错误。只有在找不到合适的内置异常时,才应创建自己的异常。
<强> EDIT2:强>
使用内置无法完成的异常可以做的一件事是添加描述错误处理程序可能使用的错误条件的属性。如果您有与客户有关的例外,则您的例外可能具有客户名称和客户ID的属性,从而使错误处理程序可以向用户显示信息性错误消息。
答案 3 :(得分:3)
在.NET中只有少数例外情况以特殊方式处理,例如ThreadAbortException,它们(通常)不能被捕获,处理和吞没。
除此之外,异常类型只是异常类型。您可以使用自己的异常(也可以使用框架中定义的异常)来执行相同的操作。
答案 4 :(得分:3)
此处概述了自定义例外的好处,但在您创建自己的例外之前,请确保BCL尚未满足您的需求:
http://mikevallotton.wordpress.com/2009/07/08/net-exceptions-all-of-them/ (其中有141个!)
答案 5 :(得分:3)
内置异常的一个烦恼是,在表示
的异常之间没有系统的区别捕获异常并根据捕获异常的位置重新抛出三个自定义异常(上面定义的含义)中的一个可能很有用。重新抛出异常时,将原始异常作为InnerException参数传递。
顺便说一下,可以定义一般异常。我不太确定这样做的利弊,我从未见过其他人这样做过。可以定义例如一个TransientFaultException(of T),它继承自(自定义)TransientFaultException;捕获TimeoutException的应用程序可能会重新抛出一个TransientFaultException(TimeOutException)并将其捕获为TransientFaultException(TimeoutException)或TransientFaultException。不幸的是,人们必须知道要创建适当通用的异常类型。如果要捕获异常并将其传递给TransientFaultException的工厂方法,则新异常将为TransientFaultException类型(异常),无论最初抛出什么类型的异常。
答案 6 :(得分:2)
自定义例外允许您做两件事:
只有在没有内置异常处理时才应创建自定义异常。
例如,在我们的应用程序中,我们有DataLayerException
当数据层遇到错误时抛出(并且包含特定的DBMS异常作为内部异常)。
我们还有DataLayerSingleResultNoneException
- 这是我们期待单个结果返回但没有结果的时候,DataLayerSingleResultManyException
这是我们期望单个结果但得到许多结果的时间。这使我们可以相应地捕捉不同的问题。