首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在VC++ 9.0下恢复异常规范行为

在VC++ 9.0下恢复异常规范行为
EN

Stack Overflow用户
提问于 2009-09-12 20:43:33
回答 2查看 186关注 0票数 2

我正在处理严重依赖于语言标准中描述的异常规范行为的旧代码。也就是说,在异常规范上调用std::意外()违反了下面描述的表单。

代码语言:javascript
运行
复制
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++下都不起作用。就纯粹个人而言,我发现这个机制其实是非常优雅的,即使是完全不常见的。但我离题了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-12 21:28:15

正如您所提到的,Visual有一种处理异常规范的“有趣”方法:

  • throw()有它的正常含义(函数不能抛出)
  • 其他任何东西(包括无例外规范)都被解释为throw(...)

这是无法回避的。然而,C++社区几乎同意异常规范是无用的。您真的需要运行时检查引发的错误类型吗?也许适当的单元测试可以取代您的运行时检查。

票数 1
EN

Stack Overflow用户

发布于 2009-09-12 21:09:58

我不认为VisualC++异常规范行为曾经(或声称是)符合标准--甚至在8.0之前--所以我不确定应用程序是如何工作的。

执行以下更改是否可行:

代码语言:javascript
运行
复制
void f() throw(T)
{
    // ...
}

至:

代码语言:javascript
运行
复制
void f()
{
    try
    {
        // ...
    }
    catch (T)
    {
        throw;
    }
    catch (...)
    {
        app_unexpected();
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1416094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档