1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//С++ Исключения Листинг #1 mingw #include <iostream> using std::cout; using std::cin; int main(){ int x = 0; //поменяйте значение на другое, вызовется другое исключение try { if (x == 0) throw ("zero_throw\n"); //Если значение x ноль, то генерируем одно исключение if (x < 0) throw("minus_throw\n"); //Если значение x отрицательное, то генерируем другое исключение if (x > 0) throw("plus throw\n"); //Если значение x положительное, то генерируем третье исключение } catch (const char* S) { cout << S << '\n'; }; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//C++ Исключения Листинг #2 mingw Пример подачи в исключение объекта своего класса #include <iostream> using std::cout; using std::cin; class MyClass{ int value; public: MyClass(){}; MyClass(const int value_):value(value_){} //конструктор с параметром для передачи значения-сигнала ошибки в объект void print() const { cout << "signal_value == " << value << '\n';} }; int main(){ int x = -1; //поменяйте значение на 0, вызовется другое исключение MyClass object; try { if (x == 0) throw (object = 0); //Если значение x ноль, то генерируем одно исключение if (x < 0) throw (object = -1); //Если значение x отрицательное, генерируем другое исключение } catch (const MyClass& object) //catch принимает параметр подобно принимающей параметр функции { cout << "block_catch\n"; object.print(); //выводим информацию на экран }; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
//C++ Исключения Листинг #3 mingw Пример подачи в исключение объекта своего класса #include <iostream> using std::cout; using std::cin; class Bad_A{ public: void info() const { cout << "zero value\n"; } }; class Bad_B{ public: void info() const { cout << "one value\n"; } }; int main(){ int x = 0; try{ if (x == 0) throw(Bad_A()); //Если x нулевое значение — генерируем исключение под тип Bad_A (подаём сигнал-значение в обработчик исключения) else if (x == 1) throw(Bad_B()); //Если x единица — генерируем исключение под ти Bad_B (подаём сигнал-значение в обработчик исключения) } catch(Bad_A value){ //Исключение для сигнал-значения с типом Bad_A value.info(); } catch(Bad_B value){ //Исключение для сигнал-значения с типом Bad_B value.info(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
//C++ Исключения Листинг #3.1 mingw Пример подачи в исключение объекта своего класса #include <iostream> using std::cout; class Age{ //Класс, сейчас обозначает возраст int i; //число, которое и будет возрастом public: void get(const int); class Small{}; //Внутри некоторого класса пустой класс для обработки одной ситуации class Big{}; //Внутри некоторго класса пустой класс для обработки другой ситуации }; void Age::get(const int i){ try{ if (i<0) throw Small(); //Если число-возраст отрицательное, то кидаем соответствующее исключение else if (i>100) throw Big(); //Если число слишком большое, то кидаем соответствующее такому развитию исключение cout << "All OK!\n"; //Если число вошло в диапазон, то всё ОК this->i = i; //Если всё ОК, то записывание значения вовнутрь класса } catch(const Small& ex){ cout << i << " very small\n"; //очень маленькое } catch(const Big& ex){ cout << i << " very big\n"; //очень маленькое } catch(...){ //перехват возникновения неописанных исключений cout << "input error\n"; } } int main(){ Age a; a.get(-5); a.get(10); a.get(200); } |
1 2 3 4 5 6 7 8 9 |
try{ if (i<0) throw Small(); //Если число-возраст отрицательное, то кидаем соответствующее исключение else if (i>100) throw Big(); //Если число слишком большое, то кидаем соответствующее такому развитию исключение } catch(...){ } cout << "All OK!\n"; //промахнулись, описали вне блока try this->i = i; //сработает, поскольку находится вне зависимости от исключений |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//C++ Исключения Листинг #4.1 mingw Пример с ошибкой типа: бросается для обработки не тот, что ловится обработчиком: #include <iostream> #include <exception> using std::cout; int main(){ try{ if (1) throw("ОШИБКА"); //Подаётся для обработки тип { const char* } } catch (int i){ //А ловится тип { int } cout << "catch_block\n"; } //Тип { const char* } не ловится обработчиками } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//C++ Исключения Листинг #4.2 mingw Пример с ошибкой типа: бросается для обработки не тот, что ловится обработчиком: #include <iostream> #include <exception> using std::cout; int main(){ try{ if (1) throw("error"); } catch (int i){ //Используем несколько catch cout << "catch_block\n"; cout << "value = " << i << '\n'; } catch (const char* S){ //Но вы уверены, что ожирять код хорошая идея? cout << "catch_block\n"; cout << "value = " << S << '\n'; } //Тип { const char* } не ловится обработчиками } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//C++ Исключения Листинг #5 mingw Пример подачи в обработчик исключения специального класса, НЕ рекомендуется #include <iostream> #include <exception> using std::cout; using std::exception; int main(){ try{ throw exception("ОШИБКА"); //условие опущено для краткости кода, бросаем в исключение тип exception } //используя конструктор этого типа, пишем в него текстовую информацию catch (const exception &ex){ //ловим обработчиком тип exception (всё также, как в параметрах функций) cout << "catch_block\n"; cout << "value = " << ex.what() << '\n'; //используем метод what() объекта ex. ex — это обычная переменная - объект класса, можно назвать иначе } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//C++ Исключения Листинг #5.1 mingw Используем logic_error #include <iostream> #include <exception> using std::cout; using std::logic_error; int main(){ int i = 10; try{ if (i) throw logic_error("error"); } catch (const logic_error &ex){ //Обратите внимание, что тип отлова изменился: стал const logic_error& cout << "catch_block\n"; //сейчас мы ловим тип logic_error& cout << "value = " << ex.what() << '\n'; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
//C++ Исключения Листинг #5.2 mingw Используем runtime_error #include <iostream> #include <exception> using std::cout; using std::cin; using std::runtime_error; int main(){ int i = 0; try{ cout << "input i: "; cin >> i; if (cin.fail()) throw (runtime_error("input error: strint in i")); //или runtime_error("error"); } catch (const runtime_error &ex){ //Обратите внимание, что тип отлова изменился cout << "catch_block\n"; //теперь мы ловим тип runtime_error cout << "value = " << ex.what() << '\n'; } } |
Добавить комментарий