C ++中的分段错误是否可以像在Java中处理NullPointerExceptions一样处理?

时间:2014-07-22 15:03:38

标签: java c++ segmentation-fault

我意识到在分段错误(C ++)和NullPointerExeception(Java)之后计算的状态实际上已被破坏,但这并不意味着整个应用程序应该关闭。 在设计良好的内聚系统中,其他计算应该能够成功完成,从而提供所需的结果。

在Java中,我们将简单地捕获NullPointerException并尽可能地跳过计算。 可以在C ++中实现相同的效果。即,对于计算,我们可以定义在特定计算产生的分段错误之后执行的特定代码,其方式与在Java中使用try catch块的方式非常相似吗?

一个简单的例子是在事件循环中,如果其中一个事件导致seg错误,则跳过处理下一个事件。

另一个例子是在Algo交易中,您将暂停执行订单并允许交易者手动接管,不会导致整个系统崩溃并破坏所有其他订单。

所以我正在寻找能够像下面的NullPointerException一样处理seg错误的C ++代码。

try {
   computation();
} catch (NullPointerException e){
   // specific code for handling the problem in the above execution of computation();
}

5 个答案:

答案 0 :(得分:0)

  

我意识到在分段错误之后计算的状态有效地被破坏了

分段错误表示您有一个错误,您的应用程序可能无法从中恢复。但我认为这不会破坏记忆,因为这不会改变记忆。这可能表明你的记忆早已被破坏。

  

可以在C ++中实现相同的效果。即,对于计算,我们可以定义在特定计算产生的分段错误之后执行的特定代码,其方式与在Java中使用try catch块的方式非常相似吗?

理论上,这可能是可能的。 C ++现在支持异常。恕我直言C ++可以做任何Java做的事情,问题是他们想要的。在实践中,我不认为这将作为标准实施。

  

在设计良好的内聚系统中,应用程序必须终止

虽然我同意这一点,但在Java中,您可以灵活地定义应用程序。例如,Java进程可以在其中运行多个应用程序,可以在运行时加载,卸载和升级。严重错误可能导致其中一个应用程序无法使用,但这并不意味着整个过程必须消亡。

答案 1 :(得分:0)

我不确定这是否可以通过C ++中的异常捕获机制来完成,但这可以在POSIX兼容的sigaction系统上实现,这允许您在一个时调用一个函数收到某些信号

Example of signal handling

答案 2 :(得分:0)

是的,你可以这样做。根据我的经验,我有时会发现失败的操作会导致将来的操作变得毫无用处(因为它们操作的数据应该是由失败的操作更新的,但是没有),或许多操作都失败了原因。但有时它确实允许大部分正确执行程序。

你们需要做一些编译器/操作系统特定的事情才能捕获分段错误,但我认为这是一个不同的问题。

答案 3 :(得分:0)

对于C ++,唯一的好解决方案是修复代码,如果不能,其他答案中解释的信号处理有风险,但可能有效。

我的首选解决方案,如果我必须管理一个程序,segfaults将为错误的代码创建一个单独的进程。这样,该过程可以自由崩溃,并从安全过程中重新启动或清除。

答案 4 :(得分:0)

TL; DR:通常答案是否定的。但是有一些系统特定的方法可以处理这种异常情况。

首先让我解释“不”部分。在解除引用空指针或其他分段错误错误的情况下,C ++不会抛出异常。这些错误的处理方式与例如越界数组访问 - 没有检查任何内容,代码只是执行。程序员负责确保不会遇到这样的错误 - 例如如果指针在使用之前为null,则可以显式检查它。

在大多数系统中,底层硬件和操作系统机制不允许访问,例如当取消引用空指针时,停止具有分段错误错误的程序。但是有些系统中解除引用空指针不会导致分段错误。无论如何处理这种情况,C ++都不会(并且很可能永远不会)包含检查它们并抛出异常的机制。

仍有一些系统相关的处理此类情况的方法,例如* nix系统中的信号,Windows中的SEH。