より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

C++の例外処理では数値をthrowできることに驚いた件

仕事上、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++でも標準例外クラスは用意されています。

kaitei.net

  • std::exception ... すべての標準例外クラスの基底
  • std::logic_error ... 論理エラー
  • std::runtime_error ... 実行時エラー
  • std::bad_alloc ... メモリ確保に失敗
  • std::bad_cast ... キャストに失敗
  • std::out_of_range ... 範囲外の添字

とりあえず、なんでもthrowでき、なんでもcatchできる無差別級なので、C++のレガシーコードの例外処理がいい加減後を任されると大変……。