почему это вызывает завершение, если я пытаюсь бросить что-то внутри блока catch в C ++ - PullRequest
10 голосов
/ 23 января 2012

У меня есть следующий код C ++, и это меня удивляет. Проблема в том, что если я что-то добавлю, кроме повторного броска внутри блока catch, программа будет прервана вызовом abort и выдаст сообщение об ошибке в GCC4, msgstr "завершить вызов после выброса экземпляра int". Если я просто использую "throw;" перебросить внутрь блока catch, все будет хорошо.

#include <iostream> 
#include <exception>
#include <stdexcept>

using namespace std;

int main()
{
    try{
        throw std::string("first throw");
    }
    catch(std::string &x){
        try{
            std::cout << x << std::endl;
//          throw;  // if I use this line, all is fine.
            throw int(2); // but if I use this line, it causes Abort() to be called
        }
        catch (int &k){
            throw;
        }
        catch(...)
        {
            cout << "all handled here!"<< endl;
        }
    }
    catch(...){
        std::cout<< "never printed" << endl;
    }
}

Ответы [ 2 ]

13 голосов
/ 23 января 2012

Если вы бросите int, то он не будет обработан;он будет пойман внутренним обработчиком catch (int &k), который его отбрасывает;и нет внешнего обработчика для перехвата переброшенного исключения, поскольку вы уже находитесь во внешнем блоке catch.Так что в этом случае terminate вызывается из-за необработанного исключения.

Если вы перебрасываете string, то он перехватывается внутренним обработчиком catch(...);это не перебрасывается, поэтому исключение было обработано.

7 голосов
/ 23 января 2012

You throw не находится внутри какого-либо обработчика try, таким образом, это приводит к вызову abort.

Вот ваш код с очищенным отступом и некоторыми встроенными комментариями:

#include <iostream> 
#include <exception>
#include <stdexcept>

using namespace std;

int main()
{
    try {
        throw std::string("first throw");
    }
    catch (std::string &x) {
        try {
            std::cout << x << std::endl;
            // throw;  // if I use this line, all is fine.
            throw int(2); // but if I use this line, it causes Abort() to be called
        }
        catch (int &k) {
            // Catches and rethrows exception. Not inside a try thus leads to abort.
            throw;
        }
        catch (...) {
            // Will handle the case where the string is rethrown instead. No abort.
            cout << "all handled here!"<< endl;
        }
    }
    catch (...) {
        std::cout<< "never printed" << endl;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...