如何处理未经检查的异常?

Posted

技术标签:

【中文标题】如何处理未经检查的异常?【英文标题】:How to work with unchecked exceptions? 【发布时间】:2010-11-08 15:01:53 【问题描述】:

Java 有compiler checked exceptions。当我过渡到 C++ 时,我了解到它没有检查异常。起初,我一直使用异常处理,因为它是一个很棒的功能。然而,过了一段时间我放弃了它,因为我遇到了一种情况每个函数都可能抛出异常。由于我编写的函数中只有一小部分会抛出异常(最多 25% 左右),因此我发现对不能抛出任何不可接受的函数进行异常处理的开销很大。

正因为如此,我真的很惊讶有很多开发人员更喜欢未经检查的异常。因此,我很想知道他们如何处理这个问题。 如果语言不支持已检查的异常,您如何避免进行不必要的异常处理的开销

备注: 我的问题同样适用于 C++ 和 C#,并且可能适用于所有其他不具备编译器检查异常处理功能的语言。

【问题讨论】:

不是每个函数都可能抛出异常。声明为“noexcept”的函数不能抛出(如果他们尝试抛出,std::terminate() 将被调用)。 【参考方案1】:

简单。您不会在“每个可能抛出的函数”中进行异常处理 - 在 C++ 中,几乎每个函数都可能这样做。相反,您可以在应用程序的某些关键点执行此操作,您可以在其中生成明智的、特定于应用程序的诊断并采取明智的、特定于应用程序的纠正措施,尽管使用 RAII 成语意味着(正如 avakar 在他的回答中指出的那样)需要采取的纠正措施通常很少。

【讨论】:

没错。这就是他们的目的。谁(什么代码)知道如何处理确实处理。 双精度:另见***.com/questions/434839/… 同意。 RAII 完成了开发人员在 Java 中需要手动完成的 99% 的工作。您只需要在剩下的 1% 的情况下添加异常处理。另请注意,80% 的统计数据是虚构的,但你明白我的意思。【参考方案2】:

当我第一次开始使用 C# 时,我也对此感到害怕。然后我发现实际上,这并不重要。我很少发现我可以catch 一个异常,因此无论如何都有一些有用的东西......无论如何,我几乎所有的异常都会冒泡到堆栈顶部附近的某个地方,在那里它们是通过中止处理的请求什么的。

现在,当我编写 Java 时,我发现检查异常很多时候都非常令人沮丧。我认为那里的某个地方是有价值的,但它带来的问题与它解决的问题一样多。

基本上,我认为我们还没有真正“正确”处理所有错误处理方面,但总的来说,我更喜欢 C# 方法而不是 Java 方法。

【讨论】:

同意。这是我发现仍需要研究的一个正在开发的领域。【参考方案3】:

除了 Neil 所说的之外,您应该注意,不需要 try/finally(或在 C++ 上下文中 try/catch/throw),因为 object destructors are called 即使抛出异常。

使用很少的try 语句很容易获得异常安全的代码。

【讨论】:

尼尔在提到 RAII 时是这么说的。 他还参考了我的回答,表示他在我发表我的回答后对他的回答进行了编辑。【参考方案4】:

特别是对于 C++,如果你设计好你的类并使用 RAII,那么开销就会大大减少。

Martin York 在this answer 中写了一个很好的例子。

该函数仍然可以抛出异常,是的,但如果确实如此,它不需要做任何特殊的清理工作。所以你只需要在一个地方实际捕获异常——能够处理它并从错误中恢复的函数。

【讨论】:

以上是关于如何处理未经检查的异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 lambda 中的已检查异常? [复制]

C# 中的异常处理 - 如何处理?

java是如何处理异常的?

如何处理无效的异常处理程序例程?

JV默认是如何处理异常

我们如何处理 bigquery 过程中的异常?