自定义例外的成本

时间:2011-05-26 21:48:42

标签: c# exception

我读过抛出异常是一项昂贵的操作。但是,不创建自己的异常会使您的代码更具表现力和可读性吗?

我的一些同事建议您只使用System.Exception并将自定义文本插入到邮件中,而不是创建新的自定义异常。

我对其他意见感兴趣。感谢任何建议。

8 个答案:

答案 0 :(得分:4)

不要抛出System.Exception。如初。

它的问题在于调用代码。出于多种原因捕获一般Exception对象是一种不好的做法。如果你抛出Exception基类的实例,那么调用代码别无选择,只能抓住Exception,如果他们想要处理它。这会强制调用代码使用错误的做法。

此外,调用代码没有可靠的方法来区分异常是什么,如果得到的只是Exception

通常最好使用其中一个预定义的例外(如果有的话适用ArgumentExceptionInvalidOperationException等)。如果没有正确描述这种情况,那么自定义异常类是一种非常好的方法。

答案 1 :(得分:2)

抛出异常本身(创建对象,遍历堆栈等)的成本很高。制作自己的异常类几乎不增加任何开销,所以如果你要抛出异常,不要使其成为new Exception("message")

答案 2 :(得分:1)

异常并不意味着人们阅读(虽然他们的消息和堆栈跟踪由人们阅读),但它们应该由代码读取。如果您的代码可以响应自定义异常而执行某些操作,那么请务必使用它。但是这个例外注定要被记录下来,没有必要自定义。

自定义异常的开销是它们是维护和测试的另一个东西。如果现有异常是合适的,请改用它。 (例如,ArgumentNullException代替ZipCodeNullException。)

答案 3 :(得分:1)

  1. 如果有任何理由以异常方式捕获和处理您的异常,那么您应该创建自己的类。
  2. 如果您的异常有任何理由采取不同的参数(例如,根据您经常可能拥有的一组参数生成特殊格式的消息),那么您应该创建自己的类。
  3. 在任何其他情况下,只使用Exception即可。一般来说,实例化或抛出自定义异常并不比标准异常花费更多,至少与首先抛出异常的费用相比。根据定义,例外情况应该是例外情况,因此在抛出例外期间的表现不是问题。关键是要在查看抛出异常的原因时获取所需的所有信息。

答案 4 :(得分:0)

你的同事正在胡说八道。无论班级如何,抛出异常都是相同的费用。

说实话,所有这些关于“昂贵”例外的讨论 - 是的,它们比无效支票或其他类型更昂贵,所以不要用它们作为一些理智检查的替代品,但是应该鼓励它们在它们有意义的地方(比如IOException,这对他们来说是一个很好的用例 - I / O问题是一个例外情况,它们通常必须在正常的程序流程之外处理。)

答案 5 :(得分:0)

你永远不应该抛出System.Exception,因为唯一的方法就是catch(System.Exception)。抓住这样的一揽子例外是非常糟糕的做法。您应该捕获特定的异常,这些异常为您提供了一种正确处理它的方法,而不会使软件崩溃。通过生成自定义异常,您可以为自己提供一种可能识别并从中恢复的方法。

例如,如果您的代码意味着打开文件,并且您获得了未知异常,那么如何从中恢复呢?但是,如果您捕获特定的File Not Found异常,则更容易从中恢复。您可以明确告诉用户该文件不存在。

我认为没有理由相信自定义异常比内置异常更昂贵。

答案 6 :(得分:0)

“昂贵”是一个相对术语,并且 - 正如名称所暗示的那样 - 异常应该是一个例外,因此它可能不会影响代码的性能。抛出异常的代价是 - 据我所知 - 与异常的类型无关,所以你不应该把自己局限于System.Exception。

但最重要的是:http://c2.com/cgi/wiki?PrematureOptimization

答案 7 :(得分:0)

我更喜欢使用最合适的内置异常,如果还不存在,则从System.ApplicationException派生出我自己的异常。

我不建议使用自定义消息抛出System.Exception。