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

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

件名:

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

差出人: Egtraさん "Yusuke Ichinohe"<valp_ab…>
送信日時 2014/10/13 22:15
ML.NO [cppll:14106]
本文:

今更ですがEgtraです。

std::functionのtargetのように、「指定した型で取り出せないならnullptrを返す」という仕様を想定していました。
すると次のように書けます。
// std::exception_ptr e;
if (auto x = e.target<std::bad_alloc>()) {
printf("A %sn", x->what());
} else if (auto x = e.target<std::runtime_error>()) {
printf("B %sn", x->what());
} else if (...)

catchと同じではないかと言われればそのとおりなのです。
catchと比較してのよっぽどの利点がないとダメですよね。

#例外throwに反応してデバッガが一時停止する設定の下では、
#むやみやたらとthrowせずに済むのがありがたいです。
#それくらいしか思いつきません。

2014年9月12日 6:52 MITSUNARI Shigeo <herumi@…>:
> 光成です。
>
>>>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が便利なケースはありそうですけど。
>
>
>
> MLホームページ: http://www.freeml.com/cppll
>
> ----------------------------------------------------------------------
> 夫婦・家族でゆったり≪温泉≫箱根・軽井沢・京都など人気のリゾ
> ート!組数限定企画!早い者勝ち!まずはご応募下さい!
> ■大感謝プラン(1):【平日】  ¥500~
> ■大感謝プラン(2):【土・連休】¥1,500~
> http://ad.freeml.com/cgi-bin/sa.cgi?id=lKtTD
> ------------------------------------------------------[freeml byGMO]--
>



--
Egtra (イグトランス)
valp_ab@…

Blog: <http://dev.activebasic.com/egtra/>
Twitter: @… <https://twitter.com/egtra>

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

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

更新順メールリスト