我正在处理严重依赖于语言标准中描述的异常规范行为的旧代码。也就是说,在异常规范上调用std::意外()违反了下面描述的表单。
foo() throw(T) { /*...*/ }没有抛出规范确实保证不会抛出,但抛出(T)规范预计会被设计的和.因为标准要求很高,并且提供了一种机制来处理它。
其原因与设计人员使用EH作为错误处理机制(由其自身的错误类层次结构控制)以及异常处理的决定有关。“EH”中的成语与他们的需求密切相关,他们走的是最不努力的道路。至少我是这么看的,考虑到系统的规模和复杂性,这对我来说并不特别令人震惊。
不过,我现在的任务是包含新的和无关的功能,代码在VC++ 9.0下的行为并不像预期的那样,原因是与8.0中引入的异常规范相关的标准有偏差。(参考:微软)
我想找个办法强迫你做正常的事。希望编译器能提供一个退路。但根本就没有。
我是不是运气不好,需要修改正确编写的、标准的代码,在350,000行代码上运行,并有一个完全开发的错误处理类层次结构?或者,您能想出一种方法来帮助我强制std::意外()行为吗?
编辑:,我正在提供一些背景信息。所讨论的系统是一个学年日历生成器,用于为分布在4,000多名学生中的一所学校提供服务,我不确定其中的一些数字,6年级和190班,外加12个虚拟(远程教学)班。与VC++ 8.0或9.0以外的任何编译器一样,MINGW是不可能的。这是由于有关为该国教育系统服务的软件的规定。
代码所需的更改正是为了适应引入不同的日历生成模式的虚拟类。然后我遇到了这个问题。该软件在日历生成过程的几个部分上大量使用异常机制,作为通过意外()映射(保存和恢复)和bad_exception映射控制工作流的一种方法,这些映射在VC++下都不起作用。就纯粹个人而言,我发现这个机制其实是非常优雅的,即使是完全不常见的。但我离题了。
发布于 2009-09-12 21:28:15
正如您所提到的,Visual有一种处理异常规范的“有趣”方法:
throw()有它的正常含义(函数不能抛出)throw(...)。这是无法回避的。然而,C++社区几乎同意异常规范是无用的。您真的需要运行时检查引发的错误类型吗?也许适当的单元测试可以取代您的运行时检查。
发布于 2009-09-12 21:09:58
我不认为VisualC++异常规范行为曾经(或声称是)符合标准--甚至在8.0之前--所以我不确定应用程序是如何工作的。
执行以下更改是否可行:
void f() throw(T)
{
// ...
}至:
void f()
{
try
{
// ...
}
catch (T)
{
throw;
}
catch (...)
{
app_unexpected();
}
}https://stackoverflow.com/questions/1416094
复制相似问题