From 32501bba1940e62adfb4b31bf92d220e193b92b5 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 7 Feb 2026 21:42:28 +0100 Subject: [PATCH] Better handling of exceptions --- app/main.cpp | 37 ++++++++++++++++++++++++++++++++++++- appsrv/main.cpp | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/app/main.cpp b/app/main.cpp index afe6d0608..f6b1a8b59 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #ifdef __APPLE__ #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) #include @@ -46,6 +47,40 @@ #include "dsp/dsptypes.h" #include "crashhandler.h" +class SDRangelApplication final : public QApplication +{ +public: + SDRangelApplication(int &argc, char **argv) : QApplication(argc, argv) + { + } + + bool notify(QObject *receiver, QEvent *event) override + { + static bool s_exitRequested = false; + try { + return QApplication::notify(receiver, event); + } catch (const std::bad_alloc &ex) { + qCritical() << "Out of memory in event handler:" << ex.what(); + if (receiver && receiver->metaObject()) { + qCritical() << "Failed on object:" << receiver << receiver->metaObject()->className(); + } else { + qCritical() << "Failed on object: (null)"; + } + } catch (const std::exception &ex) { + qCritical("Unhandled exception in event handler: %s", ex.what()); + } catch (...) { + qCritical("Unhandled non-standard exception in event handler."); + } + + if (!s_exitRequested) { + s_exitRequested = true; + QCoreApplication::exit(EXIT_FAILURE); + } + + return false; + } +}; + static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *logger) { QCoreApplication::setOrganizationName(COMPANY); @@ -81,7 +116,7 @@ static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *lo qputenv("QT_SCALE_FACTOR", scaleFactor.toLatin1()); } - QApplication a(argc, argv); + SDRangelApplication a(argc, argv); #if 1 qApp->setStyle(QStyleFactory::create("fusion")); diff --git a/appsrv/main.cpp b/appsrv/main.cpp index 849f4f76e..6b24a3922 100644 --- a/appsrv/main.cpp +++ b/appsrv/main.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -32,6 +33,40 @@ #include "remotetcpsinkstarter.h" #include "dsp/dsptypes.h" +class SDRangelServerApplication final : public QCoreApplication +{ +public: + SDRangelServerApplication(int &argc, char **argv) : QCoreApplication(argc, argv) + { + } + + bool notify(QObject *receiver, QEvent *event) override + { + static bool s_exitRequested = false; + try { + return QCoreApplication::notify(receiver, event); + } catch (const std::bad_alloc &ex) { + qCritical() << "Out of memory in event handler:" << ex.what(); + if (receiver && receiver->metaObject()) { + qCritical() << "Failed on object:" << receiver << receiver->metaObject()->className(); + } else { + qCritical() << "Failed on object: (null)"; + } + } catch (const std::exception &ex) { + qCritical("Unhandled exception in event handler: %s", ex.what()); + } catch (...) { + qCritical("Unhandled non-standard exception in event handler."); + } + + if (!s_exitRequested) { + s_exitRequested = true; + QCoreApplication::exit(EXIT_FAILURE); + } + + return false; + } +}; + void handler(int sig) { fprintf(stderr, "quit the application by signal(%d).\n", sig); QCoreApplication::quit(); @@ -59,7 +94,7 @@ void catchUnixSignals(const std::vector& quitSignals) { static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *logger) { - QCoreApplication a(argc, argv); + SDRangelServerApplication a(argc, argv); QCoreApplication::setOrganizationName("f4exb"); QCoreApplication::setApplicationName("SDRangelSrv");