Java有compiler checked exceptions。当我转换到C ++时,我了解到它没有检查异常。起初,我一直在使用异常处理,因为它是一个很棒的功能。但是,过了一段时间我放弃了它,因为我遇到了一个情况每个函数都可能抛出异常。由于我编写的函数中只有一小部分可以抛出异常(比如说最多只有25%),我发现对不能抛出任何不可接受的函数进行异常处理的开销。
因此,我很惊讶有很多开发人员更喜欢未经检查的异常。因此,我很想知道他们是如何处理这个问题的。 如果语言不支持检查异常,如何避免执行不必要的异常处理的开销?
备注:我的问题同样适用于C ++和C#,也可能适用于所有其他不支持编译器检查异常处理的语言。
答案 0 :(得分:16)
简单。你不会在“每个可能抛出的函数”中进行异常处理 - 在C ++中,几乎每个函数都可以这样做。相反,您可以在应用程序中的某些关键点执行此操作,您可以在其中生成合理的,特定于应用程序的诊断并采取合理的,针对特定应用程序的纠正措施,尽管使用RAII习语意味着(正如avakar在其答案中指出的那样)通常很少采取纠正措施。
答案 1 :(得分:11)
当我第一次开始使用C#时,我也很害怕。然后我发现实际上,这并不常见。我很少发现我可以捕捉一个异常,所以对它有用的东西......几乎所有我的异常都冒泡到堆栈顶部附近的任何地方,在那里他们通过中止来处理请求或其他。
现在,当我编写Java时,我发现检查过的异常在很多时候都非常令人沮丧。我认为那里有价值,但它会引入尽可能多的问题。
基本上,我认为我们还没有真正完成错误处理方面的“正确”,但总的来说,我更喜欢使用C#方法来实现Java方法。
答案 2 :(得分:4)
除了Neil所说的,你应该注意到不需要try/finally
(或者在C ++ try/catch/throw
的上下文中),因为object destructors are called即使抛出异常也是如此。
很容易使用极少数try
语句的异常安全代码。
答案 3 :(得分:3)
对于C ++,如果你很好地设计你的类并使用RAII,那么开销几乎就会消失。
Martin York在this answer中写了一个很好的例子。
该函数可能会抛出异常,是的,但如果确实如此,它将不需要做任何特殊的清理工作。所以你只需要在一个地方实际捕获异常 - 能够处理它并从错误中恢复的函数。