Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Обработка исключений в C++: практические примеры try, catch, throw

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

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

Помещая потенциально проблемный код в блок try и следуя за ним одним или несколькими блоками catch, вы даёте программе чёткий путь управления исключительными ситуациями.

Если исключение не брошено, блок try выполняется нормально, а обработчики пропускаются.

В этом уроке вы узнаете:

Зачем нужна обработка исключений?

Она даёт существенные преимущества:

Ключевые слова обработки исключений

Три ключевых слова образуют основу:

Код внутри try называется защищённым; если он бросает исключение, выполняется соответствующий блок catch.

Синтаксис

try {
    // защищённый код
} catch (Exception_Name exception1) {
    // обработка exception1
} catch (Exception_Name exception2) {
    // обработка exception2
}
// ... дополнительные catch-блоки

Пример 1: Доступ к элементу vector за пределами диапазона

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> vec;
    vec.push_back(0);
    vec.push_back(1);
    try {
        vec.at(2); // за пределами диапазона
    } catch (exception& ex) {
        cout << "Exception occurred!" << endl;
    }
    return 0;
}

Вывод:

Обработка исключений в C++: практические примеры try, catch, throw

Скриншот кода:

Обработка исключений в C++: практические примеры try, catch, throw

Разбор кода:

  1. Подключаем iostream и vector для ввода/вывода и контейнеров.
  2. Используем пространство имён std.
  3. Создаём vector<int> и заполняем двумя элементами.
  4. Пытаемся обратиться к элементу за границами внутри try.
  5. Перехватываем стандартное std::exception и выводим сообщение.
  6. Возвращаемся из main.

Пример 2: Обработка деления на ноль

#include <iostream>
using namespace std;
double zeroDivision(int x, int y) {
    if (y == 0) {
        throw "Division by Zero!";
    }
    return static_cast<double>(x) / y;
}
int main() {
    int a = 11, b = 0;
    double c = 0;
    try {
        c = zeroDivision(a, b);
        cout << c << endl;
    } catch (const char* message) {
        cerr << message << endl;
    }
    return 0;
}

Вывод:

Обработка исключений в C++: практические примеры try, catch, throw

Скриншот кода:

Обработка исключений в C++: практические примеры try, catch, throw

Разбор кода:

  1. Функция zeroDivision бросает C-строку при делении на ноль.
  2. Вызов функции внутри try с выводом результата.
  3. Перехват строкового исключения и вывод ошибки в cerr.

Стандартные исключения C++

Обработка исключений в C++: практические примеры try, catch, throw

Стандартная библиотека объявляет богатую иерархию исключений в <exception>. Наиболее часто используемые:

ИсключениеОписание
std::exceptionБазовый класс для всех стандартных исключений.
std::bad_allocБросается new при нехватке памяти.
std::bad_castБросается dynamic_cast при неудаче приведения.
std::bad_exceptionСигнализирует о неожиданном исключении.
std::bad_typeidБросается typeid для нулевого полиморфного glvalue.
std::logic_errorОшибки, обнаруживаемые программистом.
std::domain_errorНедопустимый домен математической функции.
std::invalid_argumentФункция получила неверный аргумент.
std::length_errorПопытка создать слишком большую строку.
std::out_of_rangeБросается vector::at при индексе за пределами.
std::runtime_errorОшибки времени выполнения, не попавшие в другие категории.
std::overflow_errorМатематическое переполнение.
std::range_errorЗначение вне диапазона для операции.
std::underflow_errorМатематическое подтечение.

Пользовательские исключения

Базовый класс std::exception можно расширить для создания доменно-специфичных типов ошибок. Переопределение what() даёт описательное сообщение.

Пример: пользовательское исключение

#include <iostream>
#include <exception>
using namespace std;
class NewException : public exception {
public:
    const char* what() const noexcept override {
        return "newException occurred";
    }
} newex;
int main() {
    try {
        throw newex;
    } catch (exception& ex) {
        cout << ex.what() << '\n';
    }
    return 0;
}

Вывод:

Обработка исключений в C++: практические примеры try, catch, throw

Скриншот кода:

Обработка исключений в C++: практические примеры try, catch, throw

Разбор кода:

  1. Наследуем NewException от std::exception и переопределяем what().
  2. Создаём объект newex для броска.
  3. Бросаем newex внутри try.
  4. Перехватываем по ссылке к std::exception и печатаем сообщение через what().

Резюме

Язык C

  1. Комментарии в C++: лучшие практики для читаемого и поддерживаемого кода
  2. Обработка исключений в Python: try, except, else и finally подробно
  3. Обработка исключений в Java: try, catch, finally, throw и throws
  4. Обработка исключений в Java: try-catch-finally и try-with-resources
  5. Оператор switch-case в C++: синтаксис, применение и практические примеры
  6. Динамическое выделение массивов в C++: практическое руководство с примерами кода
  7. Структуры (struct) в C++: объяснение с практическим примером
  8. Освоение std::list в C++: синтаксис, функции и практические примеры
  9. C++ Struct vs Class: ключевые отличия, синтаксис и лучшие сценарии использования
  10. 15 лучших IDE для C++ на Windows, macOS и Linux — бесплатные и платные (2021)