mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-05 00:41:19 -05:00
50 lines
1.2 KiB
C++
50 lines
1.2 KiB
C++
#ifndef EXCEPTION_CATCHING_APPLICATION_HPP__
|
|
#define EXCEPTION_CATCHING_APPLICATION_HPP__
|
|
|
|
#include <QApplication>
|
|
|
|
#include <boost/log/core.hpp>
|
|
#include "Logger.hpp"
|
|
|
|
class QObject;
|
|
class QEvent;
|
|
|
|
//
|
|
// We can't use the GUI after QApplication::exit() is called so
|
|
// uncaught exceptions can get lost on Windows systems where there is
|
|
// no console terminal, so here we override QApplication::notify() and
|
|
// wrap the base class call with a try block to catch and log any
|
|
// uncaught exceptions.
|
|
//
|
|
class ExceptionCatchingApplication
|
|
: public QApplication
|
|
{
|
|
public:
|
|
explicit ExceptionCatchingApplication (int& argc, char * * argv)
|
|
: QApplication {argc, argv}
|
|
{
|
|
}
|
|
bool notify (QObject * receiver, QEvent * e) override
|
|
{
|
|
try
|
|
{
|
|
return QApplication::notify (receiver, e);
|
|
}
|
|
catch (std::exception const& e)
|
|
{
|
|
LOG_FATAL ("Unexpected exception caught in event loop: " << e.what ());
|
|
}
|
|
catch (...)
|
|
{
|
|
LOG_FATAL ("Unexpected unknown exception caught in event loop");
|
|
}
|
|
// There's nowhere to go from here as Qt will not pass exceptions
|
|
// through the event loop, so we must abort.
|
|
boost::log::core::get ()->flush ();
|
|
qFatal ("Aborting");
|
|
return false;
|
|
}
|
|
};
|
|
|
|
#endif
|