ぼく用あれこれまとめ

例外処理

最終更新:

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::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;
}

参考文献



.
記事メニュー
目安箱バナー