2011-02-04 14 views
4

私は以下のコードを持っています。例外仕様に基本型がある場合、関数は派生クラス例外をスローできますか?

class Base{}; 
class Derived: public Base{}; 

class Test 
{ 
public: 
    void fun() throw(Base) 
    { 
     throw Derived(); 
    } 
}; 

int main() 
{ 
    Test ob; ob.fun(); 
} 

例外仕様リストに基本型がある場合、fun()は派生型の例外をスローできますか?

+7

"正しい"答えは、例外仕様が残念ながらそれを標準にしたという悪い考えであるということです。実際のコードは 'throw()'だけを使います。 – MSalters

+1

'throw()'はいつ有用ですか?私は標準的なアドバイスが例外仕様、たとえ 'throw()'を使うことは決してないと考えました。 –

+1

@Tim: 'throw()'は最適化を可能にし、C++ 0xが出てコンパイラは新しい 'noexcept'キーワードとして' throw() 'を扱い、関連する最適化を実行できます。 –

答えて

3

DerivedBaseから派生するので、それは技術的には、Base。したがって、メソッド署名が基本型をリストしている場合は、派生した例外の型をスローできます。

@MSaltersによると、例外仕様のあるissuesがあることに注意してください。

0

これは間違いありません。もちろん可能です。たとえば、ref(ベースクラス)の例外をキャッチして、それを再スローすることができます。

//.. 
try 
{ 
    ob.fun(); 
} 
catch(Base& ex) 
{ 
    // do something with the exception; 

    // throw; // if you want it to be re-thrown 
} 
1

はい、問題ありません。その例外仕様はタイプTためのハンドラはタイプEの例外にマッチするようなタイプT(C++ 2003、15.4標準)

3

短い答えはイエス、それが可能となるが含まれている場合、この関数はタイプEの例外を許可します、長い方: 関数の例外仕様を使用しないでください。新しい標準C++ 0xでは、非推奨になります。

なぜ彼らはそれを非難しますか?なぜなら、C++例外仕様ではjavaのように動作しないからです。何かを投げようとすると、Javaのようなコンパイルエラーは発生しません。実行時にはstd::unexpected()関数が呼び出され、予期せぬハンドラ関数が呼び出されます。この関数は、デフォルトではプログラムを終了します。

+1

例外仕様はC++ 0xでは削除されません。 _dynamic-exception-specification_は廃止予定です。 2つの大きな違いがあります。 –

+0

@Charles Bailey in C++ 0xでは、expectionの指定やnoexceptなしで関数を宣言することができます。私が間違っている? – UmmaGumma

+0

あなたのコメントは間違っていないので、どちらかを実行することもできますし、_dynamic-exception-specification_(例えば 'throw()'や 'throw(std :: exception)')関数を宣言することもできます。 –

関連する問題