c++ - 恢复 VC++ 9.0 下的异常规范行为

标签 c++ visual-studio-2008 portability exception-specification

我正在处理严重依赖于语言标准中描述的异常规范行为的旧代码。即,在违反下述形式的异常规范时调用 std::unexpected()。

foo() throw(T) { /*...*/ }

Nothrow 规范确实保证不会抛出,但是 throw(T) 预计会违反设计,并且......好吧,因为标准期望并提供了一种处理它的机制。

其原因与设计者决定除了异常处理之外还使用 EH 作为错误处理机制(由其自己的错误类层次结构控制)有关。 EH 中呈现的习语与他们的需求密切相关,他们选择了最省力的路径。至少我是这么看的,考虑到系统的规模和复杂性,这对我来说并不特别令人震惊。

然而,我现在的任务是包含新的和不相关的功能,并且由于与 8.0 中引入的异常规范标准的偏差,代码在 VC++ 9.0 下的行为不符合预期。 (引用:Microsoft)

我正在尝试找到一种强制标准行为的方法。希望编译器能够提供后备。但没有。

我是否运气不好,需要更改在 350,000 行代码上运行的正确编写的、符合标准的代码,并具有完全开发的错误处理类层次结构?或者你能想出一种方法来帮助我强制 std::unexpected() 行为吗?

编辑: 我正在提供一些背景信息。该系统是一个学年日历生成器,为一所学校提供服务,该学校为 4,000 多名学生提供服务,我还不确定其中的一些数字,包括 6 个年级和约 190 个类(class),以及 12 个虚拟(远程教学)类。 MINGW 是不可能的,除了 VC++ 8.0 或 9.0 之外的任何编译器也是如此。这是由于与服务于该国教育系统的软件相关的法规所致。

代码所需的更改正是为了适应虚拟类的引入,该虚拟类具有截然不同的日历生成模式。然后我就遇到了这个问题。该软件在日历生成过程的几个部分上大量使用异常机制,作为通过意外()映射(保存和恢复)和 bad_exception 映射控制工作流程的手段,这些映射都不能在 VC++ 下工作。纯粹就个人而言,我发现该机制实际上非常优雅,即使完全不常见。但我离题了。

最佳答案

我不相信 Visual C++ 异常规范行为曾经(或声称)符合标准 - 即使在 8.0 之前 - 因此我不确定应用程序是如何工作的。

执行以下更改是否可行:

void f() throw(T)
{
    // ...
}

至:

void f()
{
    try
    {
        // ...
    }
    catch (T)
    {
        throw;
    }
    catch (...)
    {
        app_unexpected();
    }
}

关于c++ - 恢复 VC++ 9.0 下的异常规范行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1416094/

相关文章:

windows - 将非 bat 扩展文件作为批处理文件运行

c# - 通过示例规划编程项目(C# 或 C++)

c++ - 从命名空间获取具有相同签名的函数并在 C++ 中迭代它们

visual-studio-2008 - 从命令行自动运行 NUnit 测试

multithreading - 有没有一种可移植的方式用 Qt 给线程名称?

c++全局变量的初始化顺序

c++ - 可变参数模板和 RValue 引用

c++ - 为什么 std::pair<int, int> 可以从 const std::pair<int, float>& 构造?

c - Visual Studio 2008 调试大型 c 文件

c++ - 应用程序退出时线程无法退出 - C++