Возврат исключений - PullRequest
12 голосов
/ 31 мая 2011

Почему следующее не обрабатывает исключение, которое было переброшено? Я перепробовал все комбинации, но ни одна из них не показала вывод в последнем улове, поэтому я запутался!

Derived D;

try {
       throw D;
} catch ( const Derived &d) {
       throw;
} catch (const Base &b) {
      cout << "caught!" << endl;
}

Derived D;

try {
    throw D;
} catch ( const Derived d) {
    throw;
} catch (const Base b) {
    cout << "caught!" << endl;
}

Derived D;

try {
    throw D;
} catch ( const Derived d) {
    throw;
} catch (const Base &b) {
    cout << "caught!" << endl;
}

Derived D;

try {
    throw D;
} catch ( const Derived &d) {
    throw;
} catch (const Base b) {
    cout << "caught!" << endl;
}

Ответы [ 3 ]

15 голосов
/ 31 мая 2011

Повторный бросок не обрабатывается одним и тем же блоком try-catch.Он подбрасывается в область вызова.

В [except.throw] (редакция 2003 года):

Выражение броска без операнда сбрасывает обрабатываемое исключение.

и:

Когда генерируется исключение, управление передается ближайшему обработчику с подходящим типом (15.3);«Ближайший» означает обработчик, для которого составной оператор, инициализатор ctor или тело функции после ключевого слова try был недавно введен потоком управления и еще не завершен .

Ваш блок try завершен, поэтому его обработчики не являются кандидатами.Таким образом, ни один из блоков catch в вашем коде не может обработать повторный выброс.

По общему признанию, это довольно запутанная формулировка.

9 голосов
/ 31 мая 2011

Возобновленное исключение должно быть перехвачено другим блоком try..catch, а не обработчиком перехвата того же блока try.См. Этот пример:

using namespace std;
class Base
{
public:
    virtual ~Base(){}
};

class Derived : public Base
{
};

void f()
{
    try
    {
        throw Derived();
    }
    catch(Derived& ex)
    {
        cout<<"Caught in f\n";
        throw;
    }

}

int main()
{
    try
    {
        f();
    }
    catch(Base& b)
    {
        cout<<"Caught in main\n";
    }

    return 0;
}

вывод:

Захвачен в f

Захвачен в основном

2 голосов
/ 31 мая 2011

Это должно сработать:

Derived D;


try{

    try {
        throw D;
    } catch ( const Derived &d) {
        throw;
    } catch (const Base &b) {
        cout << "caught!" << endl;
    }

} catch (const Base &b) {
    cout << "caught here!" << endl;
}

Как уже говорилось, rethrow перезапустит то же исключение из блока catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...