Не удается выйти из метода после выдачи исключения - PullRequest
0 голосов
/ 13 апреля 2019

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

Проблема в том, что я не знаю, как выйти из метода после создания исключения без получения необработанной ошибки исключения.

CircleSquare Square::operator+ (const Circle& op2)
{
    /// Variables
    CircleSquare ret;

    /// Sets the temporary Square object's characteristics to LHS's colour, the sum of LHS sideLength + RHS sideLength, and Square name
    ret.SetName((char *)"Square-Circle");
    ret.SetColour((char *)this->GetColour());

    if (sideLength >= (op2.GetRadius() * 2))
    {
        ret.SetSideLength(sideLength);
    }
    else
    {
        throw ("The sideLength of square is smaller than the diameter of the contained circle.");
        return ret; // <--- Here is where the error occurs
    }

    if ((op2.GetRadius() * 2) <= sideLength && op2.GetRadius() >= 0.0)
    {
        ret.SetRadius(op2.GetRadius());
    }
    else
    {
        throw ("The radius of contained circle is larger than the sideLength of the square.");
        return ret;
    }

    return ret;
}

Что я хочу сделать, это сделатьвыбросить исключение, а затем я выхожу из метода и обрабатываю исключение в моем блоке try-catch, но вместо этого оно вызывает «Необработанное исключение» в return ret;

Как выйтиэтого метода без получения ошибки?

1 Ответ

0 голосов
/ 13 апреля 2019

Вам нужно catch что вы throw инг. Кроме того, оператор return никогда не происходит, когда вы throw. (Вы должны удалить строку, которая говорит:

return ret; // <--- Here is where the error occurs

Скорее всего, вы увидите предупреждение об этом компилятора (это код, который никогда не будет выполнен). Ваш код должен компилироваться без запинок. Всегда. (-Werror флаг компиляции очень хорош для этого).

throw означает: возврат, но не нормальный путь

Вам нужно сделать что-то вроде:

try {
    Square a;
    Circle b;
    CircleSquare sum= a + b; // You try to sum
    // If you can, the return statement will give a value to sum
    // If you throw, sum will not get constructed, 
    // b and a will be destroyed and the catch 
    // will be executed instead of anything below
    // the call to operator+
    std::cout << "Sum is: " << sum << std::endl;
} catch (std::string s) {
    // Will only catch exceptions of type std::string
    std::cerr << "Error: " << s << std::endl;
}

Это "как", если вы сделали goto для блока catch, но очистили все.

Если вы не справитесь с этим, он все равно будет аварийно завершать каждую функцию, пока не найдет блок catch правильного типа или пока не выйдет main.

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