@@ -399,6 +399,38 @@ namespace GUIUtil
399399 },
400400 type);
401401 }
402+ template <typename Sender, typename Signal, typename Slot>
403+ auto ExceptionSafeConnect (
404+ Sender sender, Signal signal, Slot method)
405+ {
406+ return QObject::connect (
407+ sender, signal,
408+ [sender, method](auto &&... args) {
409+ bool ok{true };
410+ try {
411+ method (std::forward<decltype (args)>(args)...);
412+ } catch (const NonFatalCheckError& e) {
413+ PrintSlotException (&e, sender, nullptr );
414+ ok = QMetaObject::invokeMethod (
415+ qApp, " handleNonFatalException" ,
416+ blockingGUIThreadConnection (),
417+ Q_ARG (QString, QString::fromStdString (e.what ())));
418+ } catch (const std::exception& e) {
419+ PrintSlotException (&e, sender, nullptr );
420+ ok = QMetaObject::invokeMethod (
421+ qApp, " handleRunawayException" ,
422+ blockingGUIThreadConnection (),
423+ Q_ARG (QString, QString::fromStdString (e.what ())));
424+ } catch (...) {
425+ PrintSlotException (nullptr , sender, nullptr );
426+ ok = QMetaObject::invokeMethod (
427+ qApp, " handleRunawayException" ,
428+ blockingGUIThreadConnection (),
429+ Q_ARG (QString, " Unknown failure occurred." ));
430+ }
431+ assert (ok);
432+ });
433+ }
402434
403435 /* *
404436 * Shows a QDialog instance asynchronously, and deletes it on close.
0 commit comments