NOEMBLEM/エンブレムが設定されていません。

メールの詳細(メール表示)

件名:

Re: [Q] 複数の例外を捕まえるには?

差出人: "MITSUNARI Shigeo"さん <herumi…>
送信日時 2014/09/12 06:52
ML.NO [cppll:14105]
本文:

光成です。

>>std::functionのtarget_typeとtargetのように、中身の型を知る・中身の型
>を指定して取り出す方法がstd::exception_ptrにも欲しいなあと思うことは
>あります。
>
>なるほど。あったら便利かもしれませんね。

とかきましたが、コード的にはあまり代わりばえしない気もしました。

現状の

std::exception_ptr e;

try {
std::rethrow_exception(e);
} catch (std::bad_alloc& e) {
printf("A %s
", e.what());
} catch (std::runtime_error& e) {
printf("B %s
", e.what());
} catch (std::exception& e) {
printf("C %s
", e.what());
} catch (int e) {
printf("D %d
", e);
} catch (...) {
printf("F unknown err
");
}



const std::type_info& type = e.target_type();
if (type == typeid(std::bad_alloc)) {
printf("A %s
", e.target<std::bad_alloc>()->what());
} else if (type == typeid(runtime_error)) {
printf("B %s
", e.target<std::runtime_error>()->what());
} else if (...)

となる感じですよね。
比較と取り出しで、型を2回書かないといけない分、面倒な気もします。

std::functionではそれしか方法がないのですが、std::exceptionの場合は
まさにtry catchがあるので(型のパターンマッチといえる)現状の方がすっきり
してるのかもしれません。

このケース以外でtargetが便利なケースはありそうですけど。

このエントリーをはてなブックマークに追加
添付:

このメールは下記のメールに対する返信です:

このメールには下記のメールが返信されています:

更新順メールリスト