我的工作对旧的代码,在很大程度上依赖于例外的规范的行为的描述中的语言标准。即呼吁std::意想不到的()在例外的规范违反行为的形式描述如下。

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

抛出异常的规格,确实保证不扔了,但是 扔(T) 那些预计将违反既 通过设计 和...嗯,因为标准的期望,提供了一个机制来处理它。

为此原因是绑在设计师决定的,使用嗯也作为一个错误的处理机制(控制通过其自己的错误类层次)除了例外处理。成语呈现在是紧密映他们的需要和他们走的路径少努力。这至少是我怎么看它并不是特别让我震惊,鉴于规模和复杂性的系统。

我但现在的任务包括 新的和不相关的功能 和代码不是表现为期望在VC++9.0,由于偏离标准有关的例外规中引入了8.0.(参考: Microsoft)

我试图找到一种方法生效的标准的行为。希望一回退,以提供由编译器。但是没有的。

我的运气,需要改变正确地写入标准服从上运行的代码350,000行的代码有一个全面发展的错误处理类层次?或者你可以想办法将帮助我的力std::意想不到的()行为?

编辑: 我提供一些背景信息。该系统在的问题是一个学校的日历年生成为学校服务的一点超过4,000名学生分布在,我不能确定一些数字,但是,6年级和-190类,再加上12虚拟(远距离教学)的课程。MINGW是出的问题作任何编译器比其他VC++8.0或9.0.这是由于规定有关的软件服务的教育系统在这个国家。

必要的变动代码是完全容纳入虚拟课程有很大的不同模式日历中产生。然后我碰到了这个问题。该软件使用的例外机构在几部分的日历日的产生过程中作为一种手段来控制工作流程通过这两个意想不到的()映射(保存和恢复)和bad_exception映射,没有其下工作VC++.在一个纯粹的个人注意,我找到该机制在地方实际上很优雅的,即使完全是罕见的。但我跑题了。

有帮助吗?

解决方案

如你所述,视工作室有一个"有趣"的方式处理例外规格:

  • throw() 有其通常的含义(功能,必须不扔)
  • 别(包括不例外说明书)解释为 throw(...)

有没有办法绕过这一点。然而,C++社会相当多的同意的例外规格是无用的。你真的需要运行检查的错误类型扔?也许是适当的单元的测试可以替换您的运行检查。

其他提示

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

执行以下更改是否可行:

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

为:

void f()
{
    try
    {
        // ...
    }
    catch (T)
    {
        throw;
    }
    catch (...)
    {
        app_unexpected();
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top