C++,你可以指定功能可以或不可以扔的一个例外使用一个例外说明符。例如:

void foo() throw(); // guaranteed not to throw an exception
void bar() throw(int); // may throw an exception of type int
void baz() throw(...); // may throw an exception of some unspecified type

我怀疑有关实际使用他们,原因如下:

  1. 编译器并没有真正实行的例外符的任何严格的方式,这样的好处并不大。理想的,你想得到一个编译错误。
  2. 如果一个功能违反了一个例外说明,我认为标准的行为是终止程序。
  3. 在VS.Net,它把扔(X)作为扔(...),以遵守的标准不强。

你觉得异常说明应该使用?
请回答"是"或"否",并提供一些理由来证明你的答案。

有帮助吗?

解决方案

没有。

这里有几个例子为什么:

  1. 模板码是不可能写有例外规格,

    template<class T>
    void f( T k )
    {
         T x( k );
         x.x();
    }
    

    该副本可能会引发、参数通过可能会引发, x() 可能会引发一些未知的例外。

  2. 例外规格的往往禁止可延伸性。

    virtual void open() throw( FileNotFound );
    

    可能会演变成

    virtual void open() throw( FileNotFound, SocketNotReady, InterprocessObjectNotImplemented, HardwareUnresponsive );
    

    你真的可以写作

    throw( ... )
    

    第一是不可扩展,二是过于雄心勃勃和第三是真正的你是什么意思,当你写虚拟的功能。

  3. 传统的代码

    当你写代码,它依赖于另一个图书馆,你真的不知道什么它可能会不时出现可怕的错误。

    int lib_f();
    
    void g() throw( k_too_small_exception )
    { 
       int k = lib_f();
       if( k < 0 ) throw k_too_small_exception();
    }
    

    g 将终止,时 lib_f() 抛出。这是(在大多数情况下)不是你真正想要的。 std::terminate() 永远不应该被称为。它总是更好地让的应用程序的崩溃有未处理的例外,从中可以检索一个堆栈跟踪,而不是默默地/暴力死亡。

  4. 编写代码,返回常见的错误,并引发对特殊的场合。

    Error e = open( "bla.txt" );
    if( e == FileNotFound )
        MessageUser( "File bla.txt not found" );
    if( e == AccessDenied )
        MessageUser( "Failed to open bla.txt, because we don't have read rights ..." );
    if( e != Success )
        MessageUser( "Failed due to some other error, error code = " + itoa( e ) );
    
    try
    {
       std::vector<TObj> k( 1000 );
       // ...
    }
    catch( const bad_alloc& b )
    { 
       MessageUser( "out of memory, exiting process" );
       throw;
    }
    

尽管如此,当你的图书馆刚刚抛出自己的例外情况,可以使用例外的规范的状态下您的意图。

其他提示

避免的例外规C++。原因你放弃你的问题是一个很好的开始对于为什么。

看到草药萨特 "务实看起来在例外规格".

我认为标准,除了公约(C++)
异常符是一个实验C++标准,主要是失败。
例外的是,没有扔说明是有用的,但是你也应该添加适当的试图抓住块内,以确保代码相匹配的说明符。草Sutter有一个页面上的问题。 Gotch82

在此,我认为这是值得描述例外保障。

这些都是基本文件在如何对象的状态是受影响的例外逃的方法上的,象。不幸的是他们不是被强迫或否则提到的通过编译器。
提高和异常

例外的保障

没有保证:

没有保证有关国家的对象之后的一个例外逃脱的方法
在这些情况的对象不应再使用。

基本保证:

几乎在所有情况下,这应该是最低限度保证额的方法提供的。
这保证对象的国家是很好的定义仍然可以可持续使用。

强大的保证:(aka事务保证)

这可以保证该法将成功完成
或者一个例外会引发的对象的状态不会改变。

没有扔保证:

该法保证,没有例外是允许传播的方法。
所有析构应作出这种保证。
|Nb如果一个例外逃脱析构,而是一个例外已经传播
|应用程序将终止

海湾合作委员会将发出警告,当你违反了例外的规格。我要做的就是使用宏使用的例外规格只有在"棉绒"模式编制有明确的检查,以确保例外同意我的文档。

唯一有用的例外,说明是"扔()",在"不扔"。

没有。如果使用他们和一个异常,你没有指定,或者通过代码或代码称为你的代码,然后默认行为是以立即终止程序。

此外,我相信它们的使用已经不在目前的草案C++0x标准。

例外规格不是奇妙的有用工具C++。然而,没/是一个很好的使用对他们来说,如果结合std::意想不到的。

我做什么在某些项目的代码的例外规格,然后叫来调用set_unexpected来(),与一个函数,将引发一个特殊的例外,我自己设计的。此外,在建筑,取得回溯(在一平台的具体方式)和来自std::bad_exception(允许它是传播如果希望的话)。如果这会导致终止()呼叫,因为它通常不会,回溯印的是什么()(以及原来的异常引起的;不要难找到的那样)和所以我获得信息的我的的合同遭到了侵犯,例如什么意想不到的图书馆除外被抛出。

如果我这么做我永远不会允许传播的图书馆的例外情况(除性病的人)和获得我所有的例外情况从性病::例外。如果一个图书馆决定抛出的,我会赶上并转换成我自己的层次结构,允许我总是控制代码。模板功能,这一呼吁的依赖功能应该避免的例外规格为显而易见的原因;但这很稀有一个模板功能的接口,与图书馆码无论如何(和几个图书馆实际使用的模板中的一个有用的方式)。

如果你写代码,将使用的人,而是会来看看能宣言》比任何评论围绕着它,然后说明会告诉他们其中的例外情况,他们可能想赶上。

否则我找不到它特别适用于使用任何东西,但 throw() 来表示,它不扔任何例外。

一个"扔()"说明书允许的编译器,来执行一些优化时代码流量分析,如果它知道这一职能将永远不会扔的一个例外(或至少承诺永远不会扔的一个例外)。拉里*奥斯特曼谈这个简要在这里:

http://blogs.msdn.com/larryosterman/archive/2006/03/22/558390.aspx

一般我不会使用的例外符。然而,在情况如果任何其他例外是来自功能的问题,该计划将明确能无法 正确的, 然后它可以是有用的。在所有情况下,确保文件清楚什么样的例外可能是预期从这一职能。

是的,预期的行为的非指定的例外时被抛从功能的例外说明是呼吁终止().

我会还注意到,斯科特*梅尔的地址这个问题的更有效C++。他有效C++和更有效C++强烈建议书。

是的,如果你进入内部文件。或者,也许写个图书馆,其他人会使用,使他们能够告诉会发生什么没有咨询的文件。扔或不投掷可以认为API的一部分,几乎像返回值。

我同意,他们不是真正有用的强制执行的正确性Java式编译器,但总比没有好的或无计划的评论意见。

他们可能是有用的单元测试,以便在编写测试你知道什么期望的功能扔当它失败,但没有执行它们周围在编译器。我认为他们是额外的代码没有必要在C++。任何你选择的所有你应该是肯定的是,你遵循同样的编码标准的项目和团队成员,以便你的代码仍然是可读的。

从这篇文章:

http://www.boost.org/community/exception_safety.html

"众所周知,不可能 写一个例外安全的通用 容器。" 这个要求是经常听到 参考文章,汤姆 Cargill[4]在其他探讨了 问题的异常安全 一般堆模板。在他 文章,嘉吉提出了许多有用的 的问题,但不幸的是失败 本解决他的问题。1他 最后建议, 解决方案可能是不可能的。不幸的是,他的文章读 许多作为"证据"的投机。由于发表有 许多例子中的异常安全 通用部件,其中C++ 图书馆标准的容器。

事实上,我可想到的方式使模板类例外安全。除非你不能控制所有的分类,然后你可以有一个问题。要做到这一可能造typedef在类定义的例外情况引发的各种模板课程。此认为问题是如既往的跟踪它月之后而不是设计它在从一开始,我认为这是这种开销那是真正的障碍。

例外规格=垃圾,要求任何Java开发人员年龄超过30

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top