仕事上、C++を使うのですが、C#ではExceptionを継承した例外がスローされるので
try { throw new Exception("なんか例外") } catch(Exception e) { Console.WriteLine(e.ToString()); }
などで、だいたい何が起きたのか把握できるのです。
が、C++では数値でもthrowできます。
#include <iostream> using namespace std; int main(void){ try{ throw 2; std::cout << "通常処理"; } catch(int i){ std::cout << "数値がスローされました。"; } }
なんて書き方が出来ます。
弱ったのが、以下のようなケース
#include <iostream> using namespace std; int main(void){ try{ throw "なんか例外"; std::cout << "通常処理"; } catch(...) { std::cout << "よくわかんないけど、なんか例外"; } }
...としておけばなんでもcatch出来ますが、catchしても、どこで何が起きたのかわからんです。
もちろん、C++でも標準例外クラスは用意されています。
- std::exception ... すべての標準例外クラスの基底
- std::logic_error ... 論理エラー
- std::runtime_error ... 実行時エラー
- std::bad_alloc ... メモリ確保に失敗
- std::bad_cast ... キャストに失敗
- std::out_of_range ... 範囲外の添字
とりあえず、なんでもthrowでき、なんでもcatchできる無差別級なので、C++のレガシーコードの例外処理がいい加減後を任されると大変……。