我正在处理严重依赖于语言标准中描述的异常规范行为的旧代码。即,在违反下述形式的异常规范时调用 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/