2022-03-13 05:10:01 +00:00
|
|
|
|
2012-02-20 21:47:14 +00:00
|
|
|
/* This file is (c) 2008-2012 Konstantin Isakov <ikm@goldendict.org>
|
2010-01-17 13:04:55 +00:00
|
|
|
* Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */
|
|
|
|
|
|
|
|
#include "termination.hh"
|
|
|
|
#include <exception>
|
|
|
|
#include <QtCore>
|
|
|
|
|
|
|
|
|
|
|
|
static void termHandler()
|
|
|
|
{
|
2023-04-10 04:36:07 +00:00
|
|
|
|
|
|
|
// Trick: In c++17, there is no standardized way to know the exception name/type inside terminate_handler
|
|
|
|
// So, we just get the exception and throw it again, so that we can call the std::exception::what :)
|
|
|
|
|
|
|
|
// This trick can be removed/improved if something similar to
|
|
|
|
// boost::current_exception_diagnostic_information got standardized,
|
|
|
|
|
|
|
|
std::exception_ptr curException = std::current_exception();
|
|
|
|
|
|
|
|
try {
|
|
|
|
if ( curException != nullptr ) {
|
|
|
|
std::rethrow_exception( curException );
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
qDebug() << "GoldenDict has crashed unexpectedly.\n\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch ( const std::exception & e ) {
|
|
|
|
qDebug() << "GoldenDict has crashed with exception: " << e.what() ;
|
|
|
|
}
|
2022-03-13 05:10:01 +00:00
|
|
|
|
2018-05-22 14:37:21 +00:00
|
|
|
if( logFilePtr && logFilePtr->isOpen() )
|
|
|
|
logFilePtr->close();
|
2013-09-20 14:25:44 +00:00
|
|
|
|
2022-03-13 05:10:01 +00:00
|
|
|
abort();
|
2010-01-17 13:04:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void installTerminationHandler()
|
|
|
|
{
|
|
|
|
std::set_terminate( termHandler );
|
|
|
|
}
|