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

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Исключения позволяют обрабатывать ошибки элегантно. Разберем использование.

Базовый try-catch
Код:
#include <iostream>
using namespace std;

int divide(int a, int b) {
    if(b == 0) {
        throw "Деление на ноль!";
    }
    return a / b;
}

int main() {
    try {
        int result = divide(10, 0);
        cout << "Результат: " << result << endl;
    }
    catch(const char* error) {
        cout << "Ошибка: " << error << endl;
    }
    
    return 0;
}

Типы исключений
Код:
#include <iostream>
#include <stdexcept>
using namespace std;

class CustomException : public exception {
private:
    string message;
    
public:
    CustomException(const string& msg) : message(msg) {}
    
    const char* what() const noexcept override {
        return message.c_str();
    }
};

int main() {
    try {
        throw CustomException("Кастомная ошибка");
    }
    catch(const CustomException& e) {
        cout << "Ошибка: " << e.what() << endl;
    }
    catch(const exception& e) {
        cout << "Общая ошибка: " << e.what() << endl;
    }
    
    return 0;
}

Множественные catch блоки
Код:
#include <iostream>
#include <stdexcept>
using namespace std;

void processNumber(int num) {
    if(num < 0) {
        throw invalid_argument("Число отрицательное");
    }
    if(num > 100) {
        throw out_of_range("Число слишком большое");
    }
    cout << "Число обработано: " << num << endl;
}

int main() {
    try {
        processNumber(-5);
    }
    catch(const invalid_argument& e) {
        cout << "Неверный аргумент: " << e.what() << endl;
    }
    catch(const out_of_range& e) {
        cout << "Вне диапазона: " << e.what() << endl;
    }
    catch(const exception& e) {
        cout << "Общая ошибка: " << e.what() << endl;
    }
    
    return 0;
}

Вложенные try-catch
Код:
#include <iostream>
using namespace std;

void innerFunction() {
    try {
        throw "Внутренняя ошибка";
    }
    catch(const char* e) {
        cout << "Поймано внутри: " << e << endl;
        throw; // проброс дальше
    }
}

int main() {
    try {
        innerFunction();
    }
    catch(const char* e) {
        cout << "Поймано снаружи: " << e << endl;
    }
    
    return 0;
}

Стандартные исключения
Код:
#include <iostream>
#include <stdexcept>
#include <vector>
using namespace std;

int main() {
    try {
        vector<int> vec(5);
        
        // out_of_range
        cout << vec.at(10) << endl;
    }
    catch(const out_of_range& e) {
        cout << "Вне диапазона: " << e.what() << endl;
    }
    
    try {
        // bad_alloc
        int* arr = new int[10000000000];
    }
    catch(const bad_alloc& e) {
        cout << "Недостаточно памяти: " << e.what() << endl;
    }
    
    return 0;
}

RAII и исключения
Код:
#include <iostream>
#include <memory>
using namespace std;

class Resource {
private:
    int* data;
    
public:
    Resource() {
        data = new int[100];
        cout << "Ресурс выделен" << endl;
    }
    
    ~Resource() {
        delete[] data;
        cout << "Ресурс освобожден" << endl;
    }
    
    void use() {
        throw "Ошибка при использовании";
    }
};

int main() {
    try {
        Resource res;
        res.use();
    }
    catch(const char* e) {
        cout << "Ошибка: " << e << endl;
    }
    // Деструктор вызывается автоматически
    
    return 0;
}

noexcept спецификатор
Код:
#include <iostream>
using namespace std;

void safeFunction() noexcept {
    // Функция не выбрасывает исключений
    cout << "Безопасная функция" << endl;
}

void riskyFunction() {
    throw "Ошибка";
}

int main() {
    try {
        safeFunction();
        riskyFunction();
    }
    catch(...) {
        cout << "Поймано исключение" << endl;
    }
    
    return 0;
}

Важные моменты:
- Используйте исключения для обработки ошибок
- Всегда освобождайте ресурсы
- Применяйте RAII принцип
- Документируйте исключения

Исключения делают код более надежным!
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху