最好检测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。 当你得到OutofMemoryException
, ThreadAbortException
时,你无能为力
我同意Henk Holterman
。