From f9d9c2a43cca78ec8544d0b0eacd5d9830169f28 Mon Sep 17 00:00:00 2001 From: Martin Dobias Date: Fri, 27 Jun 2014 17:09:24 +0700 Subject: [PATCH] Improve exception handling - Do at least very basic handling in QtConcurrent run functions - Do not show a message box when not running in main thread --- src/core/qgsapplication.cpp | 12 +++++-- src/core/qgsmaprenderercustompainterjob.cpp | 17 +++++++++- src/core/qgsmaprendererparalleljob.cpp | 36 +++++++++++++++++++-- 3 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/core/qgsapplication.cpp b/src/core/qgsapplication.cpp index 15178249fd6..4e928d3eacd 100644 --- a/src/core/qgsapplication.cpp +++ b/src/core/qgsapplication.cpp @@ -244,15 +244,21 @@ bool QgsApplication::notify( QObject * receiver, QEvent * event ) } catch ( QgsException & e ) { - QMessageBox::critical( activeWindow(), tr( "Exception" ), e.what() ); + QgsDebugMsg( "Caught unhandled QgsException: " + e.what() ); + if ( qApp->thread() == QThread::currentThread() ) + QMessageBox::critical( activeWindow(), tr( "Exception" ), e.what() ); } catch ( std::exception & e ) { - QMessageBox::critical( activeWindow(), tr( "Exception" ), e.what() ); + QgsDebugMsg( "Caught unhandled std::exception: " + QString::fromAscii( e.what() ) ); + if ( qApp->thread() == QThread::currentThread() ) + QMessageBox::critical( activeWindow(), tr( "Exception" ), e.what() ); } catch ( ... ) { - QMessageBox::critical( activeWindow(), tr( "Exception" ), tr( "unknown exception" ) ); + QgsDebugMsg( "Caught unhandled unknown exception" ); + if ( qApp->thread() == QThread::currentThread() ) + QMessageBox::critical( activeWindow(), tr( "Exception" ), tr( "unknown exception" ) ); } return done; diff --git a/src/core/qgsmaprenderercustompainterjob.cpp b/src/core/qgsmaprenderercustompainterjob.cpp index 67d833712c4..1c09f22eef0 100644 --- a/src/core/qgsmaprenderercustompainterjob.cpp +++ b/src/core/qgsmaprenderercustompainterjob.cpp @@ -187,7 +187,22 @@ void QgsMapRendererCustomPainterJob::futureFinished() void QgsMapRendererCustomPainterJob::staticRender( QgsMapRendererCustomPainterJob* self ) { - self->doRender(); + try + { + self->doRender(); + } + catch ( QgsException & e ) + { + QgsDebugMsg( "Caught unhandled QgsException: " + e.what() ); + } + catch ( std::exception & e ) + { + QgsDebugMsg( "Caught unhandled std::exception: " + QString::fromAscii( e.what() ) ); + } + catch ( ... ) + { + QgsDebugMsg( "Caught unhandled unknown exception" ); + } } void QgsMapRendererCustomPainterJob::doRender() diff --git a/src/core/qgsmaprendererparalleljob.cpp b/src/core/qgsmaprendererparalleljob.cpp index 9a40fc91daf..d456f17899a 100644 --- a/src/core/qgsmaprendererparalleljob.cpp +++ b/src/core/qgsmaprendererparalleljob.cpp @@ -207,7 +207,24 @@ void QgsMapRendererParallelJob::renderLayerStatic( LayerRenderJob& job ) QTime t; t.start(); QgsDebugMsg( QString( "job %1 start" ).arg(( ulong ) &job, 0, 16 ) ); - job.renderer->render(); + + try + { + job.renderer->render(); + } + catch ( QgsException & e ) + { + QgsDebugMsg( "Caught unhandled QgsException: " + e.what() ); + } + catch ( std::exception & e ) + { + QgsDebugMsg( "Caught unhandled std::exception: " + QString::fromAscii( e.what() ) ); + } + catch ( ... ) + { + QgsDebugMsg( "Caught unhandled unknown exception" ); + } + int tt = t.elapsed(); QgsDebugMsg( QString( "job %1 end [%2 ms]" ).arg(( ulong ) &job, 0, 16 ).arg( tt ) ); Q_UNUSED( tt ); @@ -218,7 +235,22 @@ void QgsMapRendererParallelJob::renderLabelsStatic( QgsMapRendererParallelJob* s { QPainter painter( &self->mFinalImage ); - drawLabeling( self->mSettings, self->mLabelingRenderContext, self->mLabelingEngine, &painter ); + try + { + drawLabeling( self->mSettings, self->mLabelingRenderContext, self->mLabelingEngine, &painter ); + } + catch ( QgsException & e ) + { + QgsDebugMsg( "Caught unhandled QgsException: " + e.what() ); + } + catch ( std::exception & e ) + { + QgsDebugMsg( "Caught unhandled std::exception: " + QString::fromAscii( e.what() ) ); + } + catch ( ... ) + { + QgsDebugMsg( "Caught unhandled unknown exception" ); + } painter.end(); }