ぼく用あれこれまとめ
例外処理
最終更新:
bokuyo
-
view
例外処理
- try/catch/throw、それと__finally
例外処理とは言っても。
- MSさんがWindowsにおいてサポートしている例外処理(例外ハンドラ)は大きくわけて3つある。
- 構造化例外処理
- システムデフォルト例外処理
- ベクトル化例外処理(ベクタ例外処理)
- この中でtry/throw/catchのようなコンパイラレベルで実装されるものを、構造化例外処理と呼んでいる。
- システムデフォルト例外処理というとこういうの→MSDN - SetUnhandledExceptionFilter
こんな感じ。
try{ if(boku != Riaju){ if(boku == kagikko){ throw "Liaju"; } else{ throw "Not Bakuhatsu"; } } std::cout << "Bakuhatsu" << endl } catch(const char* errorMessage){ std::cout << errorMessage; }
- try{}の直後、catch{}の直後なら、catchはいくつも作れる。
- MSのマネージ拡張C++なら、__finallyが使える。
- __finallyの中では、try{}の中で使用した変数などの後始末を記述する。
- tryがthrowを投げようが投げまいが、どのように処理されようが、____finallyは関係なく呼び出される。
自作例外クラスはいかにして作るべきか?
Ogre 3D ではどうしているか?
標準の例外クラスを継承してつくる
- 標準の例外クラスの中でも継承して使えそうなにおいがするのは
- std::exception
- std::logic_error
- std::runtime_error
- std::exception
- std::logic_error と std::runtime_error は<stdexcept> 内で宣言されてるのでそれをインクルード
- std::exception やそのほか派生クラスのstd::bad_cast とかは<exception>内で宣言されてる。
- <stdexcept>内で<exception>をインクルードしてるからstdexceptさえインクルードしとけばよさそう。
標準の例外クラスをとりあえずtypedef して使うとか。
#include <stdexcept> namespace bokuyo { typedef std::runtime_error Exception; }
参考文献
- MSDN - 14.3 __finally キーワード
- C/C++セキュアコーディング(Robert C. Seacord 著)
.