有时我不知道应该抛出什么类型的异常。所以我通常抛出Exception()。有没有关于这个的好文章?

有帮助吗?

解决方案

如果你没有做任何尝试从错误中恢复,你可以抛出一个Exception用字符串来告诉你什么地方出了错。 (或者,如果你将执行相同的操作,不管发生了什么错误)。

除了使之明显,一个程序员什么地方出了错通过使用新的异常名称,而不是把它的消息,异常可以包含数据,以帮助你从一个特定的异常中恢复。

例如,一个ArgumentNullException有一个属性ParamName,其中,当你抛出异常应设置。当呼叫者捕获它,他可以再看看这个属性,并决定通过对造成错误,或者可以打印相关的错误,告知什么地方出了错程序员参数的新值。

这是不幸的例外很少用来实现其全部潜力(在许多开源API和这样的),也常常简单地插入通知程序员什么地方出了错。这里没有这2个太大的区别,如果你不打算当你抓住它读取ParamName属性。 (很多人不会理会,只抓到一个Exception反正)。

throw new ArgumentNullException("arg1");
throw new Exception("arg1 is null");

这可能很难从错误中完全恢复,但在某些应用中,虽然,你可能会发现需要创建自定义的例外,可以提供所有你需要的信息。

现在,我只想把Exception成VS对象浏览器搜索,看看还有什么好了。他们的名字是非常强的自我解释,所以你应该能够挑选出合适的东西。

其他提示

引发通用异常的问题在于,它限制了代码在堆栈中进一步正确处理异常的能力(即最佳实践是在回退之前捕获最具体的异常,并且仅捕获您可以处理的异常)。

Jeffrey Richter 在异常处理方面有一篇精彩的章节(包括有关 System.Exception 命名空间的信息) 通过 C# 进行 CLR

“框架设计指南”由Cwalina和Abrahms覆盖这个话题真的很好(恕我直言)

这是免费提供的在线这里,还是这本书(不是免费的)这里(英国)这里(美国)。题为看在部分的例外设计指南的。

那么,有一件事你不应该做的就是扔Exception本身。结果 总是寻找适当的子类。

我不知道任何出版物的拼写出哪个异常抛出的时候,而是ArgumentExceptionInvalidOperationException应采取的大部分的情况下照顾。

询问不同的案件中不同的问题,如果他们来了。

我建议根据系统状态将异常分为几类:

  1. 这个方法失败了,什么也没做。任何基础数据的状态都没有受到干扰,并且可能是有效的。典型场景:尝试从集合中检索不存在的对象,或添加已经存在的对象。另一种可能的情况:在不应导致任何数据丢失的情况下发生通信超时(如果问题只是另一端太慢,则重试操作可能会成功)。
  2. 该方法以可能扰乱底层数据结构的方式失败,或者底层数据结构可能先前已被破坏。除非采取步骤对其进行验证,否则不应尝试对此数据结构进行进一步的操作。另一种可能的情况:当部分检索记录并且部分检索的数据现在丢失时,会发生通信超时。根据协议的不同,可能需要对连接执行一些恢复操作,或者关闭它并启动一个新连接。
  3. 系统状态出现严重错误,并且可能无法恢复。

不幸的是,现有的 .net 异常并不符合这种模式。如果有一个 ExceptionBase 类型,从中派生出 ThreadAbortException、CpuHasCaughtFireException 和“正常”异常,并且所有“正常”异常都从 Exception 派生,那就太好了。我知道 .net 4.0 在这样的设计中有些混乱,但我不知道确切的机制。无论如何,我建议任何用户定义的异常都应按上述方式分组,每个组中的所有异常都共享与其他组不同的共同祖先。

还有由克齐斯茨托夫·克瓦林纳所谓的选择异常的正确类型的抛出该棚一些光这一点。它涉及选择合适的例外创建自定义异常抛出和指导。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top