Exceptions Обработка исключений в программе
Здравствуйте!
Хотелось бы в своем приложении сделать цетрализованную обработку исключительных ситуаций для их логирования.
Переопределил метод notify():
static const int EC_MAINLOOP_ERROR = 1; static const int EC_MAINLOOP_UNKNOWN_ERROR = 2; bool MyAppApplication::notify(QObject *re, QEvent *ev) { try { return QApplication::notify(re, ev); } catch(QString &e) { QString s = QString("Программа аварийно завершила свою работу с сообщением: %1. Источник %2"). arg(e).arg(re->objectName()); qDebug() << s; log(s); // Запись в лог QTimer::singleShot(0, this, [this]() { exit(EC_MAINLOOP_ERROR); }); } catch(...) { QString s = QString("Программа аварийно завершила свою работу по неизвестной причине. Источник %1") .arg(re->objectName()); qDebug() << s; log(s); // Запись в лог QTimer::singleShot(0, this, [this]() { exit(EC_MAINLOOP_UNKNOWN_ERROR); }); } return false; }
Далее,
если я вызываю исключение так: throw 1; - управление передается notify(), исключение обрабатывается, логируется и т.д.
если же я вызываю сбой, например так:
int v = 0;
v = 25 / v;
То сбой не доходит до notify(), появляется сообщение и программа закрывается.
Обрамлял исключение в свой блок try catch:
try { int v = 0; v = 35 / v; } catch(...) { throw 2; }
Сбой не доходит до catch, программа завершается с ошибкой.
Если же я внутрь try поставлю throw 1; - то сбой возникнет, но он будет обработан notify.
Как быть, чтобы:
1) Обрабатывались исключения, не только вызванные throw
2) Исключения обрабатывались сначала внутри локальных try catch блоков, а необработанные доходили до notify().
Это возможно?
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 11 листопада 2024 р. 22:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 08:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 08:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
Добрый день.
Вы делаете некорректную попытку создать исключение.
Исключения генерируются кодом, то есть любое исключение, которое вы перехватываете, всегда генерируется оператором throw.
Деление на ноль не генерирует исключение в общем случае, оно просто кладёт программу.
То есть даже такой код не сгенерирует ожидаемое вами исключение
Так что, предполагаю, что по первому пункту у вас в данный момент проблема надуманная.
Впрочем на некоторых форумах пишут, что данные исключения замаскированные сопроцессором и их можно ловить. Например, вот это должно работать под Windows.
Но это уже платформозависимый код.
Я так полагаю, что у вас что-то не так с кодом программы, если приходится ловить подобные исключения. Возможно, что стоит добавить дополнительные проверки, чтобы подобные исключения вообще не возникали.
Спасибо большое.
Я долгое время писал на Object Pascal, привык, что там любое исключение, а не только сгенерированное самостоятельно, может быть перехвачено и обработано в блоках try. Дело в том, что не всегда можно точно предугадать, какой код приведет к сбою. И когда программа просто "падает", не оставляя следов, такое отладить сложно, особенно если оно нестабильно. Для этого и хотел сделать логирование сбоев, как это делал в Object Pascal.