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

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

件名:

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

差出人: "MITSUNARI Shigeo"さん <herumi…>
送信日時 2014/09/10 14:17
ML.NO [cppll:14100]
本文:

光成です。

>例外をthrowする側では std::exception_ptr の集合: exception_list を
>throwします。exception_list には begin()/end() があるので内包する
>exception_ptrを列挙できます。そうすると、
>
>try {
> try {
> ここで exception_list がthrowされる
> } catch ( exception_list& errors ) {
> for ( exception_ptr eptr : errors ) {
> std::rethrow_exception(eptr); // [*] 再throw
> }
> } catch ( そのほか ) {
> ...
> }
>} catch ( foo_error& xxx ) {
> // [*]でthrowされたのを捕まえる-1
>} catch ( bar_error& yyy ) {
> // [*]でthrowされたのを捕まえる-2
>}
>
>こんなカンジかしら。
>...んでもこれだと exception_list のイッコ目が catch
>されたらcatch節を抜けちゃうですよね?
>
>複数の例外を捕まえるのって、どうやるんでしょ?

質問の意図をとり間違えているのかもしれませんが、for()の部分で
catchしたら駄目なんでしょうか。

#include <exception>
#include <stdio.h>
#include <vector>
#include <stdexcept>

typedef std::vector<std::exception_ptr> exception_list;

void f()
{
exception_list es = {
std::make_exception_ptr(std::bad_alloc()),
std::make_exception_ptr(std::runtime_error("run")),
std::make_exception_ptr(std::out_of_range("out")),
std::make_exception_ptr(int(5)),
};
throw es;
}

int main()
{
try {
f();
} catch (exception_list& es) {
for (std::exception_ptr e: es) {
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
");
}
}
}
}
---
% clang++ -std=c++11 t.cpp && ./a.out
A std::bad_alloc
B run
C out
D 5

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

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

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

更新順メールリスト