2011-02-10 8 views
1

私は予期しない例外を処理しようとしていますが、動作させることはできません。 出力:int型予期せぬことが起こった

私はそれをしようとすると発生しませんどのキャッチ

呼ば

予期しない彼らは、出力があるべきと言うC++ Reference

// set_unexpected example 
#include <iostream> 
#include <exception> 
using namespace std; 

void myunexpected() { 
    cerr << "unexpected called\n"; 
    throw 0;  // throws int (in exception-specification) 
} 

void myfunction() throw (int) { 
    throw 'x'; // throws char (not in exception-specification) 
} 

int main (void) { 
    set_unexpected (myunexpected); 
    try { 
    myfunction(); 
    } 
    catch (int) { cerr << "caught int\n"; } 
    catch (...) { cerr << "caught other exception (non-compliant compiler?)\n"; } 
    return 0; 
} 

:からこれは一例です。私の出力は次のようになります。
は、他の例外キャッチ私はVS2010のSP1を使用してい

unexpected
+3

「予期せぬことが起こった。はい、例外はそうです。 –

+1

'g ++'では、これは正しく動作します。おそらくそれはVS2010の特色ですか? – templatetypedef

+1

Bjarne自身が例外仕様が壊れていると言っています...それらを使用しようとしているか、または良いコンパイラサポートを期待していません。 –

答えて

6

Documentation氏は述べています(非準拠のコンパイラを?): C++標準関数が例外をスローした場合、予期しないが呼び出されることを必要としますその投げリストにはありません。現在の実装はこれをサポートしていません。
したがって、VC10は非準拠のコンパイラです。

+0

D'oh、今日の投票から外れました。さもなければ私はこれを+1します...それは素晴らしい答えです。 – templatetypedef

+0

一度これは良いことです。例外仕様は根本的に壊れています(いくつかの説明はhttp://www.gotw.ca/publications/mill22.htmを参照)。 –

0

Visual Studioは標準を正しく実装していません。 this MSDN pageを参照してください。 intは解析されますが使用されません。

0

関数に例外指定子がある場合、Visual C++は常にWarning C4290を発行します。 MSDNの同じ記事から:"関数はVisual C++が受け付けるが実装していない例外仕様を使用して宣言されています。"したがって、このコンパイラは標準に準拠していません。

関連する問題