Почему моя программа аварийно завершает работу из-за исключения, даже если я ловлю этот тип исключения? - PullRequest
0 голосов
/ 16 декабря 2011

У меня есть этот код:

printf("hello\n");
try
{
    for ( unsigned i = 0; i < par.size(); i++ )
        rep.delete_rev(par[i]);
}
catch(TriedToDeleteRoot e)
{
    printf("catched 1 !\n");
}
catch(...) {
    printf("catched sth else !\n");
}
printf("hahaha\n");

и вот что у меня на выходе:

hello
terminate called after throwing an instance of 'TriedToDeleteRoot'
  what():  Tried to delete root

почему?TriedToDeleteRoot наследует от std :: exception, и я понятия не имею, что не так.Спасибо.

РЕДАКТИРОВАТЬ: вот как я выбрасываю исключение:

throw TriedToDeleteRoot();

Ответы [ 2 ]

4 голосов
/ 16 декабря 2011

Я предполагаю, что конструктор копирования для TriedToDeleteRoot не работает.

Предлагаю (как всегда) ловить по константной ссылке:

try
{
    for ( unsigned i = 0; i < par.size(); i++ )
        rep.delete_rev(par[i]);
}
catch(const TriedToDeleteRoot& e)
{
    printf("caught 1 !\n");
}

или в общем случае:

catch(const std::exception& e)
{
    std::cerr << "exception: " << e.what() << std::endl;
}
1 голос
/ 16 декабря 2011

Вы наблюдаете, что std::terminate вызывается, даже если у вас есть try / catch, который, как вы ожидаете, соответствует исключению, которое выдается.

Одна из причин, по которой это может произойти, -Вам удалось создать исключение, пока обрабатывается предыдущее исключение.Вы можете наблюдать это с помощью:

#include <iostream>

int main() {
   try {
     struct test {
       ~test() { throw 0; }
     } test;
     throw 0;
   }
   catch (...) {
     std::cout << "Caught something" << std::endl;
   }
}

В моей системе это вызывает abort() и выводит:

прекращение вызова после броска экземпляра 'int'

Обратите внимание, что catch(...) никогда не попадет из-за этого.

Этот простой пример иллюстрирует самый простой способ случайно сделать это - бросок из деструктора .Мое лучшее предположение из того, что вы показали, что это то, что происходит.Отладчик должен подтвердить это для вас.

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