C++ 中的全局异常处理以防止崩溃

问题描述 投票:0回答:1

我正在将旧的 C++ 应用程序从 OpenVMS 迁移到 Linux。该应用程序大量使用操作系统功能,我们正在努力在 Linux 中找到类似的功能。一种是操作系统库函数的全局异常处理,可从 C++ 代码调用。该函数捕获异常并使用 sys$unwind 函数(另一个 OpenVMS 系统函数)来展开堆栈并跳回异常之前的上一个点/函数。这样做的原因之一是为了防止系统在尝试访问另一个可能不可用的应用程序或资源时崩溃。因此,它不会使应用程序失败或崩溃,而是返回到上一点并再次尝试。 我知道它非常危险并且不理想,但我正在寻找 c++/linux 中的类似库或函数。

我遇到了 Linux 的 libunwind lib,但不知道如何使用它来处理全局异常并跳转到上一个函数。任何帮助将不胜感激。

c++ linux exception openvms libunwind
1个回答
0
投票

评论太长,所以...

C++ 有 try-throw-catch。您需要了解使用 VMS 异常处理的目的和原因。这是有/曾经有原因的。 VMS 应用程序通常不使用异常处理来修复被零除异常或分段错误(也称为访问违规)并从异常继续。它们通常向父函数/例程返回错误状态。这意味着检查和返回状态不必在每个中间函数中进行编码。

也就是说,一个或多个函数启用(它们自己的)处理程序。应用程序(或操作系统)发出(操作系统或应用程序定义的)错误代码。调用链中的所有处理程序都会被调用,并决定它们是否可以/想要处理错误情况。处理程序之一决定展开堆栈,通常从启用它(处理程序)的函数返回错误代码。总有一个处理程序。 RTL 或操作系统中至少有一个处理程序 - 通常打印回溯信息的最后机会处理程序。展开时,所有处理程序都会被再次调用,以便它们可以进行任何必要的清理。

使用 libunwind 库,您应该能够实现 VMS 的异常处理。我什至不会想到尝试这样做。我宁愿使用 C++ 语言构造并用它调整或重写代码。但同样,您需要了解使用 VMS 异常处理的目的和原因。

© www.soinside.com 2019 - 2024. All rights reserved.