2016-07-30 7 views
0

Javaの場合、Objectクラスはすべてのクラスの基本クラスです。そのようなクラスはC++でもありますか?質問のC++のすべての基本クラス

私の動機は次のとおりです。

try 
{ 
    if (something) throw int(a); 
    if (something) throw char(b); 
    if (something) throw float(c); 
} 
catch(...) 
{ 
    handle 
} 

は、これとは別に、単一のcatchブロックを使用して、すべてのこれらの例外を処理するための他の方法はありますか?

+1

Javaとは異なり、C++には必須/暗黙の基本クラスはありません。そして、私は組み込みのプリミティブデータ型を投げることができるかどうかはわかりません。 –

+1

それはちょうど私にとっては悪いデザインのようです。解決したい*実際の問題は何ですか? –

+0

もちろんそれらを投げることができます。単一のキャッチブロックでそれらのすべてを処理したい場合は、統一されたインターフェイスをスローする必要があります。 – m8mble

答えて

6

普遍的な基本クラスは、C++ではありません。

例外クラスは、通常、std::exceptionから派生します。したがって、catch(const std::exception&)を使用できます。

catch(...)は、例外オブジェクトタイプ(プリミティブタイプを含む)をキャッチします。 throw;catchブロック内再スローすることができる。

try 
{ 
    if (something) throw int(a); 
    if (something) throw char(b); 
    if (something) throw float(c); 
} 
catch(...) 
{ 
    if(stillFailed) throw; // throws the same exception again 
} 

catch(...)ブロック内、std::current_exception()を使用して、(未知の型の)スローオブジェクトを表すstd::exception_ptrオブジェクトを取得することも可能です。その後、他のstd::exception_ptrオブジェクトと同等かどうかを比較したり、std::rethrow_exception()を使って別の関数から再取得したりすることができます。 http://en.cppreference.com/w/cpp/header/exceptionを参照してください。例外オブジェクトに直接アクセスする方法はありません。型が不明なためです。

0

いいえ、シングルキャッチブロックを使用してこれらの例外をすべて処理する方法はありません。

異なるデータ型を処理するには、異なるキャッチブロックが必要です。チャー にintキャッチ(int型M)

(チャーM)

ため 状等

1

このような場合の最も普遍的なタイプはstd::stringです(結局のところ、最も複雑なプログラムでさえ単純な文字の配列です)。

オブジェクトをテキスト形式にエンコードし、処理側で解析/解釈します。テキスト指向や動的言語に優れたスイッチ - あなたがこのアプローチを取ることをいとわないだろう場合

template<class T> 
std::string toString(const T& x); 

try 
{ 
    if (something) throw toString(int(a)); 
    if (something) throw toString(char(b)); 
    if (something) throw toString(float(c)); 
} 
catch(const std::string& ex) 
{ 
    decode and handle 
} 

はしかし、その後、C++は、プログラミングを行うための右の言語ではありません。

+0

プリミティブ型をラップする 'std :: exception'のサブクラスを記述し、推測するのではなく、なぜプリミティブがスローされたのかの意味論的説明を持つ名前を提供してください'catch'ブロックを読むときに何が起こっているのですか? – Jules

関連する問題