2012-02-29 9 views
1

異なるオープンソースライブラリを使用している私のアプリでは、それは異なる例外をスローします。 私は例外処理を扱う経験がありません。私はいつも試してみた/考えています。
問題があります。 これで、内部のすべての例外を処理するオブジェクトを作成するのが好きです。そして、私はどのように起動してする考えを持っていない場合でも、それも可能
私は私のクラスのAとBを持っ例えば C++一般的な例外オブジェクトのすべてのタイプの例外を処理する方法は?

私は自分のアプリケーション で中心的な場所でこれらの種類などを処理するために何とかしたい
Class A 
{ 
void method1() 
{ 
    Foo foo = new foo // external lib throws throw std::bad_alloc(); 
} 
}; 

Class B 
{ 
Void method1() 
{ 
    Int d = m_foo[0] // external lib throw std::runtime_error(message); 
} 
}; 

何戦略を私は使用すべきですか?

UPDATE:
提案提供し、自分のアプリケーションのメインでのtry/catchを実装を試した後、例外が取得し、すべてのIMをスローした場合、それはそこに着くことはありません問題は、このですが、その試してみるになることはありません/ catch:
visual studio run time error

+1

このエラーは、assert()という命令が原因で発生しています。この構文は括弧で囲まれた条件付きの式を取得し、falseになると実行を中断し、表示されているダイアログを表示します。 – Baltasarq

答えて

2

と同様のものを使用します。 C++標準ライブラリのすべての例外はstd::exceptionから派生しているので、これは良いバックアップです。ただし、すべての異なる種類の例外、または少なくともより一般的な例外を区別する必要があります。 std::runtime_errorから派生したクラスとして独自の例外を作成することもできます。 複数のセクションをキャッチセクションにすることができますが、より一般的なセクションから順に並べ替えられます。

try { 

// more things... 

} 
catch(const std::bad_alloc &ba) 
{ 
    // memory error 
    std::cerr << "Memory error" << std::endl; 
    exit(EXIT_FAILURE); 
} 
catch(const std::runtime_error &re) 
{ 
    // customized error, probably 
    std::cerr << "ERROR: " << re.what() << std::endl; 
    exit(EXIT_FAILURE); 
} 
catch(const std::exception &e) 
{ 
    // general (unexpected) error 
    std::cerr << "Unexpected ERROR: " << e.what() << std::endl; 
    exit(EXIT_FAILURE); 
} 

あなたはstdexceptexceptionを#includeする必要があります覚えておいてください。 これが役立つことを願っています。

+0

このリンクのような例外クラスの利点は何ですか: http://www.cplusplus.com/doc/tutorial/exceptions/ – user63898

+0

そのリンクで例外を使用するための基礎が与えられています。まず、何かが例外としてスローされる可能性があることを紹介し、標準ライブラリの例外階層から始めます。文字列の代わりに例外クラスを使用する利点は、スローされた例外クラスからあらゆる種類のエラーを区別できることです。 – Baltasarq

1

catch all/default例外ハンドラを使用します。 、しかし、

try 
{ 

} 
catch(...) 
{ 

} 

キャッチを使用すると、すべてが悪いデザインであることに注意してください、それはあなたの問題を隠し:あなたは、キャッチのパラメータとして省略記号(...)を使用する場合
は、そのハンドラは、例外をキャッチしますむしろ、それぞれの例外を具体的に処理し、それぞれに対して適切な処置を取る必要があります。

+1

最後のコメントで保存されました! :) – Nim

0

あなたはすべての例外をキャッチtry/catchを使用することができます。

try 
{ 

} 
catch (...) //catches all exceptions 
{ 

} 
0

は通常、あなたがあなたのmain()機能でtry... catch構造を使用することができます

#include <stdexcept> 
try { 
    ... 
} catch (std::exception const& e) { 
    // catches std::exception and derived, e.what() can be used to log the root cause 
} catch (...) { 
    // catches anything thrown, not only exceptions 
} 
関連する問題