Требуется перехватывать системные исключения вне основного потока. В основном потоке все очень просто:
Переопределяем QApplication::notify() и радуемся:
bool notify(QObject *obj, QEvent *ev)
{
bool result = false;
try{
result = QApplication::notify(obj, ev);
} catch(...){
qDebug() << "exception";
result = false;
}
return result;
}
В качестве теста использовал следующий код (событие нажатия на QPushButton):
void MainWindow::on_pb1_clicked()
{
QObject* obj = (QObject*) 0x00112233;
delete obj;
}
Все отлично отрабатывает при указании опции компиляции -EHa. Но есть одна проблема. При использовании QThread данная конструкция не работает. Пример:
Переопределили функцию on_pb1_clicked():
void MainWindow::on_pb1_clicked()
{
QPluginLoader pluginLoader("d:/Sources/qt/_BUILDS/Plugin/Desktop_Qt_5_5_1_MSVC2013_64bit/release/FirstPlugin.dll");
QObject *pluginObj = pluginLoader.instance();
if (pluginObj){
CensorPluginRootInstance* root = qobject_cast<CensorPluginRootInstance *>(pluginObj);
if (root) {
PluginInterface* plugin = root->createPluginObject();
if (plugin){
ui->teStat->append("plugin load ok!");
QThread* thread = new QThread;
connect(thread, &QThread::started, plugin, &PluginInterface::Work);
plugin->moveToThread(thread);
thread->start();
} else
ui->teStat->append("plugin not loaded 3!");
}else
ui->teStat->append("plugin not loaded 2!");
}else
ui->teStat->append("plugin not loaded 1!");
}
Код плагина:
bool Plugin::Work()
{
char* pc = (char*)0x00112233;
delete pc;
return false;
}
Плагин подгружается, о чем свидетельствует надпись "plugin load ok!", а затем:
Как программно перехватить исключения, вызванные не из основного потока?