Обработка исключений C++

184
01 февраля 2020, 00:40

Есть одна исключительная ситуация, но нужно чтобы на нее было 2 разных реакции.

 void f1() {
        //throw ситуация 1
    }
    void f2() {
        //throw ситуация 1
    } 
int main() {
    try
    {
        /*
        .
        .
        .
        */
    }
    catch (...)
    {
        //реакция на ситуация 1
        //в f1()
    }
    catch (...) {
        //реакция на ситуация 1
        //в f2()
    }
    return 0;
}

Класс ошибки должен быть один, но при этом в catch реакции разные. Когда ситуация противоположна этой(возникают 2 разные ситуации, но ловится одном cathc), я понимаю как реализовать. Есть догадка что это делается с помощью полиморфизма, но пока что я не понимаю как.

Answer 1

Есть разные варианты...

  • код функций не ваш, вы не можете его менять.

Либо обертываем каждый вызов f1() в

try {
    f1();
} catch (ThatException&)
{
    throw F1Exception();
}

(соответственно, f2() в свой блок), либо пишем функцию-обертку

void f1ex()
{
    try {
        f1();
    } catch (ThatException&)
    {
        throw F1Exception();
    }
}

(опять же - свою для f2()) и вызываем ее. F1Exception можно сделать наследником ThatException - того самого исключения, которое f1 и f2 генерируют. Тогда можно будет не делать отдельные блоки, а проверять, скажем, с помощью dynamic_cast, кто именно сгенерирован. Или сделать одно исключение FException с полем, которое будет указывать, где оно сгенерировано.

  • код функций ваш, вы можете его менять.

Если генерация исключения выполняется именно вашим кодом - делаете исключения разными, или одним с добавлением поля, или разными, но унаследованными от общего. Если f1/f2 вызывают нечто, что может дать одинаковые исключения - то как выше, оборачивайте эти вызовы в блоки try-catch или в функции-обертки.

"По-моему, так." (с) Пух

Answer 2

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

READ ALSO
Крашется компилятор qt

Крашется компилятор qt

При отладки кода на c++, IDE выводит вот такое сообщение: FTH: (11040): * Fault tolerant heap shim applied to current processThis is usually due to previous crashes

145
Ошибка: “Не определен базовый класс”

Ошибка: “Не определен базовый класс”

Не могу понять в чем ошибка при наследовании, компилятор пишет, что не определен базовый класс, хотя все заголовки и определение класса я сделалВот...

154
Реальные достоинства Java [закрыт]

Реальные достоинства Java [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав...

164