Странное C ++ исключение "определение" - PullRequest
0 голосов
/ 22 июля 2010

Мой ученик представил код C ++, похожий на следующий.Код компилируется и запускается, но оператор throw выдает следующее сообщение:

terminate вызывается после создания экземпляра int

Если я сделаю функциюvoid компилятор жалуется

неверное использование 'void'

в строке, содержащей оператор throw (как ожидается).

class TestClass
{
public:
    int MyException()
    {
        return 0;
    }

    void testFunc()
    {
        throw MyException();
    }
};


int main(int argc, char** argv)
{
    TestClass tc;
    tc.testFunc();

    return 0;
}

Итак, как C ++ интерпретирует MyException, поскольку код «правильный»?

Ответы [ 2 ]

9 голосов
/ 22 июля 2010

Вызывает функцию: MyException(), затем выдает возвращенное int.Более полный пример:

struct foo
{
    int bar(void) const
    {
        return 123456789;
    }

    void baz(void) const
    {
        throw bar();
    }
};

int main(void)
{
    try
    {
        foo f;
        f.baz(); // throws exception of type int, caught below
    }
    catch (int i)
    {
        // i is 123456789
    }
}

Без блока try-catch исключение распространяется из main, где вызывается terminate().

Обратите внимание, что выбрасывает вещи, которые не являются производнымис std::exception осуждается.Ожидается, что вы сможете поймать значимые исключения по catch (const std::exception&).

2 голосов
/ 22 июля 2010

Программа остановлена, поскольку исключение не было перехвачено.Попробуйте это:

int main(int argc, char** argv) 
{ 
    try
    {
        TestClass tc; 
        tc.testFunc(); 
    }
    catch(int)
    {
    }

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