Заявления о вылове полностью игнорируются - PullRequest
8 голосов
/ 03 августа 2011

Я столкнулся с ситуацией с некоторым унаследованным кодом ... честно говоря, я считаю, что код написан правильно, но эта ошибка все еще проявляется.

Я быстро отмечу, что код кросс-компилируется из Linux в LynxOS, я не уверен, может ли это иметь какое-либо отношение к ошибке.

В основном, в одном конкретном случае:

try {
    std::vector<ClassA> x = SomeGeneratingFunction();

    //We get to here fine.  X may be empty/unpopulated though.
    if (x.size() < 1)
    {
        throw(MyException("It crashed."));
    }
}
catch (MyException e)
{
    //Handle it.
}
catch (...)
{
    //Handle it.
}

Мы бросаем, учитывая, что вектор не заселен, но по какой-то причине бросок обходит предложения catch - оба из них. Кажется, что это происходит здесь - хотя мы обычно не формируем область действия оператора if, но это не должно иметь никакого значения, так как она все еще находится в области действия try.

PS: приведенный ниже код фактически является содержимым функции, и исключения вызываются из функции при вызове, даже если они должны обрабатываться блоками catch.

Есть идеи, как это возможно? И да, это не настоящие классы кода / исключения, но класс исключения - это простой пример, по которому Google перегружает std :: exception, а SomeGeneratingFunction () возвращает хороший вектор, даже если он пустой. Я не могу предоставить реальный код, но это очень близко, за исключением каких-либо мелких опечаток, которые я, возможно, сделал, написав его на макушке моей головы.

Ответы [ 6 ]

11 голосов
/ 21 октября 2014

Поскольку предложение catch (...) не уловило исключение, мой ответ не решает проблему OP. Но для других, которые нашли этот вопрос на SO, возможно, мой ответ полезен, потому что он объясняет, почему первый улов не удался.

У меня была похожая проблема, когда мой catch(const std::exception& ex) просто не работал. Это оказалось глупой проблемой, потому что я переключался между исключениями C # и C ++, и в C # вам нужно указывать new, когда вы вызываете свое исключение, в то время как в C ++ вы обычно этого не делаете (но вы можете, но в в этом случае вы бросаете указатель, а не ссылку). Я случайно делал

throw new std::runtime_error("foo");

так

catch(std::exception*  ex)

поймал бы это, но

catch(std::exception& ex)

нет. Конечно, решение состоит в том, чтобы просто удалить новый оператор, поскольку это не традиционный шаблон проектирования в C ++.

1 голос
/ 03 августа 2011

Поскольку у вас есть запасной набор скобок вокруг объекта исключения в операторе throw, он выглядит как вызов функции. Есть ли вероятность того, что вы определили функцию с именем throw? Параметр конструктора исключений не позволяет ему стать жертвой Most Vexing Parse , но это возможно, если ваш реальный код отличается от вашего примера.

0 голосов
/ 06 августа 2015

Если у вас есть функция MyException в меньшем объеме (возможно, даже случайно, Most Vexing Parse), тогда throw MyException("It crashed") вызовет эту функцию и выдаст возвращаемое значение.

0 голосов
/ 03 августа 2011

Я бы просто переписал его без использования try / catch.В любом случае, здесь не совсем уместно использовать try / catch.Насколько вам известно, исключения могут не работать на вашей целевой платформе.

0 голосов
/ 03 августа 2011

Позвольте мне урезать проблему ... Не используйте исключения в C ++, если вы не хотите определенно завершить работу программы. Я знаю, что исключения могут быть весьма полезными, но они имеют очень плохую производительность, потому что это вызывает аппаратное исключение, которое отлавливается ядром операционной системы. Использование возвращаемых значений и кодов ошибок может быть в 500 раз быстрее, чем выдача и отлов исключений.

0 голосов
/ 03 августа 2011
catch (MyException e)

следует читать:

catch (const MyException &e)

Я не уверен, почему ваш бросок тоже выглядит как функция, странная.

Edit:

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

Мне кажется, что компилятор выключен, 1011 * определен как нечто смешное? Если бы он был пустым, мог бы иметь смысл, если бы ваш компилятор игнорировал операторы catch без попытки.

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