最好检测exception并抛出它们或者只是让运行时抛出它们?

让我们说有这样的设置:

public class MyClass { public void DoSomething(string Data) { //if (String.IsNullOrWhiteSpace(Data)) //throw new NullReferenceException(); //Do something with Data and let it throw?? } } public class EntryPointClass { public void DoIt(string Data) { var logicClass = new MyClass(); try { logicClass.DoSomething(Data); } catch(Exception ex) { } } } 

在DoSomething中,我可以检测到问题并抛出exception。 在测试EntryPointClass时,我可以测试预期结果或测试catch中发生的事情。

为什么抛出exception而不是等待一个exception更好? 无论哪种方式,我们都抓住了它!

你这两个:

 public void DoSomething(string Data) { if (String.IsNullOrWhiteSpace(Data)) //throw new NullReferenceException(); throw new ArgumentException("Data"); //Do something with Data and let it throw?? } 

目的是尽早提出并提供具体信息。
扔在这里的直接原因是与DoSomething()的合同被打破了。 发信号,不要等待`DoSomething()进行并打破其他合同。

失败快,早失败。

抛出自己的exception以防止外部看到exception的实际来源,从而获得有关您实现的信息。

您可以使用自定义消息或自定义exception抛出参数exception,以提供有关参数无效原因的更多详细信息。

使用exception处理的目的处理可能无法控制的exception。 如果您计划将代码包装在try-catch块中,但NullReferenceException除外,那么您应该有适当的处理这种类型的exception并执行与此错误相关的任何必要操作。

话虽如此,在你知道你可能有错误可能引发exception的情况下,最好检查一下这种情况 – 而不是抛出错误,而是优雅地处理它。 否则你只是通过exception编码,这是一种反模式。

请记住,例外就是规则的例外情况,而不是对代码执行中可能出错的任何问题进行全面检查。

想象一个例外,就像一个男人从一个燃烧的房子里跳出来并呼救:你不希望他们吓唬普通民众,但你确实希望他们通知合适的人对火做些什么。 考虑到这一点:

1)如果你在DoSomething中有什么问题并且你知道如何解决它 – 你不需要例外:只需在DoSomething中修复它。

2)如果DoSomething在处理问题时遇到问题(错误的属性,资源不可用等等) – 使用exception来解决问题并在可以进行此类处理的级别上处理它。

3)如果DoSomething以某种方式搞砸你无法以任何方式影响(比如文件系统崩溃和IOexception) – 只需捕获exception,记录并优雅地关闭 – 至少这种情况看起来不像是内爆。

在一组情况下,您不应该提前检测错误情况,而不是仅仅让代码失败,这是在代码控制之外依赖外部资源的情况。 例如处理网络,文件系统等的任何事情。

任何这些的问题是检查代码可以成功,然后实际操作仍然可能失败。 你通过添加检查代码所做的就是增加你编写的代码量 – 你仍然需要编写代码来处理实际的失败。

Eric Lippert有一篇关于Exception的精彩文章。

请点击链接。 它是如何处理exception的非常好的资源。

根据经验,尝试避免exception而不是尝试处理exception。 并没有抓住所有的例外。 我在你的代码中看到了Catch(Exception ex) 。 捕获您可以处理的exception。 当你得到OutofMemoryExceptionThreadAbortException时,你无能为力

我同意Henk Holterman