Активный
- Тема Автор
- #1
Исключения позволяют обрабатывать ошибки элегантно. Разберем использование.
Базовый try-catch
Типы исключений
Множественные catch блоки
Вложенные try-catch
Стандартные исключения
RAII и исключения
noexcept спецификатор
Важные моменты:
- Используйте исключения для обработки ошибок
- Всегда освобождайте ресурсы
- Применяйте RAII принцип
- Документируйте исключения
Исключения делают код более надежным!
Базовый 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 принцип
- Документируйте исключения
Исключения делают код более надежным!