C++ (Qt)#include <iostream>#include <string>#include "signal_slot.h"#include "messenger.h" using namespace std; typedef ssc::messenger3<string, string, double&> exception_type; // Это класс, который содержит информацию о том что произошло и где это произошло.. ну и т.д. /* Вот этот класс и для простоты он имеет только одну функцию */class SomeClass{public: ssc::signal<const exception_type &> exception; // сигнал - замещает исключения double func(double x) { if (x == 0.0) // пытаемся делить на ноль! exception(exception_type("func", "divizion by zero", x)); /* Шлём сигнал об этом безобразии, указывая также имя функции, где это произошло, что произошло, и ссылку на x*/ return 1.0 / x; }}; /* Класс обработчик исключений */class ExceptionHandler : public ssc::trackable{public: void handleEvent(const exception_type& e) { /* Выводит информацию о том что случилось и */ cout << e.arg1 << endl; cout << e.arg2 << endl; cout << e.arg3 << endl; const double epsilon = 0.0000001; e.arg3 = epsilon; // Вмешивается в дальнейший процесс, изменяя наш x! }}; int main(){ SomeClass sc; // создаём наш класс ExceptionHandler eh; // создаём класс обработчик sc.exception.connect(&eh, &ExceptionHandler::handleEvent); // коннектим их double res = sc.func(0.0); // Вызываем функцию в нуле! cout << res << endl; // и что же получаем?? return 0;}
C++ (Qt) double func(double x) { if (x == 0.0) // пытаемся делить на ноль! exception(exception_type("func", "divizion by zero", x)); /* Шлём сигнал об этом безобразии, указывая также имя функции, где это произошло, что произошло, и ссылку на x*/ return 1.0 / x; }
C++ (Qt) double func(double x) { double result = 1.0 / x; if (TestNan(result)) throw MyException("func", "float divizion by zero", x); return result; } int funcInt(int x, int y) { if (!x) throw MyException("funcInt", "integer divizion by zero", x); return y / x; }
C++ (Qt)#include <iostream>#include <string>#include "signal_slot.h"#include "messenger.h" using namespace std; typedef ssc::messenger3<string, string, double&> exception_type; int funcF(double x, double y) { // Пример функции, кидающей обычное исключение if (x == 0.0) throw exception_type("funcF", "divizion by zero", x); return y / x;} void exceptionHandler(const exception_type &e) { // Функция обработки исключений cout << e.arg1 << endl; cout << e.arg2 << endl; cout << e.arg3 << endl; const double epsilon = 0.0000001; e.arg3 = epsilon;} class SomeClass{public: SomeClass() { // В самом конструкторе соединяем наши сигналы с обработчиками exception.connect(exceptionHandler); } ssc::signal<const exception_type &> exception; double func(double x) { if (x == 0.0) exception(exception_type("func", "divizion by zero", x)); return 1.0 / x; }}; int main(){ SomeClass sc; // Создаём наш клас и всё.. double res = sc.func(0.0); /* Проблемный момент, но мы хотим исправить ситуацию не прерывая программу! */ cout << "res = " << res << endl; // До этой точки мы дойдём! try { double res = funcF(0.0, 1.0); // А вот функция, кидающая обычные исключения cout << "res = " << res << endl; // Сюда мы уже не попадём!! (без лишниз телодвижений) } catch (exception_type e) { cout << e.arg1 << endl; cout << e.arg2 << endl; cout << e.arg3 << endl; const double epsilon = 0.0000001; e.arg3 = epsilon; // Вот на этом всё и закончится) } return 0;}
C++ (Qt)void exceptionHandler(const exception_type &e) { if (e.arg2 == "Mein Gott!!!") throw MyException; cout << e.arg1 << endl; cout << e.arg2 << endl; cout << e.arg3 << endl; const double epsilon = 0.0000001; e.arg3 = epsilon;}