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, 2:58 Т.Қ.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:50ұпай,
- Бағалау ұпайлары-4
- molni99
- Қаз. 26, 2024, 1:37 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:80ұпай,
- Бағалау ұпайлары4
- molni99
- Қаз. 26, 2024, 1:29 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:20ұпай,
- Бағалау ұпайлары-10
Добрый день.
Вы делаете некорректную попытку создать исключение.
Исключения генерируются кодом, то есть любое исключение, которое вы перехватываете, всегда генерируется оператором throw.
Деление на ноль не генерирует исключение в общем случае, оно просто кладёт программу.
То есть даже такой код не сгенерирует ожидаемое вами исключение
Так что, предполагаю, что по первому пункту у вас в данный момент проблема надуманная.
Впрочем на некоторых форумах пишут, что данные исключения замаскированные сопроцессором и их можно ловить. Например, вот это должно работать под Windows.
Но это уже платформозависимый код.
Я так полагаю, что у вас что-то не так с кодом программы, если приходится ловить подобные исключения. Возможно, что стоит добавить дополнительные проверки, чтобы подобные исключения вообще не возникали.
Спасибо большое.
Я долгое время писал на Object Pascal, привык, что там любое исключение, а не только сгенерированное самостоятельно, может быть перехвачено и обработано в блоках try. Дело в том, что не всегда можно точно предугадать, какой код приведет к сбою. И когда программа просто "падает", не оставляя следов, такое отладить сложно, особенно если оно нестабильно. Для этого и хотел сделать логирование сбоев, как это делал в Object Pascal.