| 
									
										
										
										
											2020-09-24 18:32:58 +01:00
										 |  |  | #ifndef EXCEPTION_CATCHING_APPLICATION_HPP__
 | 
					
						
							|  |  |  | #define EXCEPTION_CATCHING_APPLICATION_HPP__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QApplication>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-27 13:25:38 +01:00
										 |  |  | #include "Logger.hpp"
 | 
					
						
							| 
									
										
										
										
											2020-09-24 18:32:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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 display
 | 
					
						
							|  |  |  | // exceptions in a message box.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | 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) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2020-09-27 13:25:38 +01:00
										 |  |  |         LOG_FATAL (e.what ()); | 
					
						
							| 
									
										
										
										
											2020-09-24 18:32:58 +01:00
										 |  |  |       } | 
					
						
							|  |  |  |     catch (...) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2020-09-27 13:25:38 +01:00
										 |  |  |         LOG_FATAL ("Unexpected fatal error"); | 
					
						
							| 
									
										
										
										
											2020-09-24 18:32:58 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2021-01-26 18:22:10 +00:00
										 |  |  |     return false; | 
					
						
							| 
									
										
										
										
											2020-09-24 18:32:58 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |