我读到过抛出异常是一项昂贵的操作。然而,创建自己的异常是否会使您的代码更具表现力和可读性呢?
我的一些同事建议使用System.Exception并将自定义文本插入消息中,而不是创建新的自定义异常。
我对其他意见很感兴趣。欢迎任何建议。
ArgumentException
的代码? - StriplingWarriorApplicationException
更为合适。 - Jeffrey L WhitledgeApplicationException
派生自定义异常一样(“最初认为自定义异常应该从ApplicationException类派生; 然而,在实践中发现这并没有增加显著的价值。有关更多信息,请参阅处理异常的最佳实践。”) - Jeff Sternal抛出异常本身的开销(创建对象、遍历堆栈等)是很高的。自己制作异常类几乎不会增加任何开销,因此,如果要抛出异常,请不要使用new Exception("message")
!
异常并不是给人类阅读的(尽管人们会阅读它们的信息和堆栈跟踪),而是给代码阅读的。如果您的代码能够对自定义异常做出响应,那么请务必这样做。但是,异常只是注定要被记录下来,没有必要创建自定义异常。
自定义异常的开销在于需要维护和测试另外一组内容。如果已有的异常适用,就使用它们。(例如,使用ArgumentNullException
而不是ZipCodeNullException
。)
在任何其他情况下,只需使用 Exception
即可。一般来说,实例化或抛出自定义异常并不比标准异常更耗费资源,至少与首次抛出异常的开销相比如此。异常本质上应该是异常的,因此在抛出异常时性能不是问题。关键是在查看为什么抛出异常时拥有所有所需信息。
你的同事在胡说八道。无论是哪个类,抛出异常的成本都是相同的。
说实话,“昂贵”的异常 - 是的,它们比空检查或其他一些操作更昂贵,因此永远不要将它们用作某些理智检查的替代品,但应该在它们有意义的地方鼓励使用(例如 IOException,这是它们的一个很好的用例 - I/O 问题是一个特殊情况,通常必须在正常程序流之外处理)。
你不应该抛出 System.Exception
,因为唯一能捕获它的方式是通过 catch(System.Exception)
。这样做非常不好的习惯,应该捕获特定的异常,这样可以在不崩溃软件的情况下正确处理它们。通过生成自定义异常,您可以识别并从中恢复。
例如,如果您的代码意味着要打开一个文件,但出现了未知异常,那么该如何恢复?然而,如果您捕获了特定的“文件未找到”异常,那么恢复就容易得多了。您可以明确告诉用户该文件不存在。
我认为自定义异常并不比内置异常更昂贵。
我更喜欢使用最合适的内置异常,如果不存在,则从System.ApplicationException派生自己的异常。
我不建议抛出带有自定义消息的System.Exception。
System.Exception
还是从它派生或使用其他内置类,您都必须抛出它,因此费用实际上在于生成和抛出异常,而不是编写它们。 - BoltClock