Skip to content

Commit 03cc355

Browse files
committed
Catch exception from script and pipe it into feedback
1 parent e735d9f commit 03cc355

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

src/core/processing/qgsprocessingalgrunnertask.cpp

+13-3
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,30 @@ QgsProcessingAlgRunnerTask::QgsProcessingAlgRunnerTask( const QgsProcessingAlgor
2727
, mParameters( parameters )
2828
, mContext( context )
2929
, mFeedback( feedback )
30-
, mAlgorithm( algorithm->create() )
3130
{
3231
if ( !mFeedback )
3332
{
3433
mOwnedFeedback.reset( new QgsProcessingFeedback() );
3534
mFeedback = mOwnedFeedback.get();
3635
}
37-
if ( !( mAlgorithm && mAlgorithm->prepare( mParameters, context, mFeedback ) ) )
36+
try
37+
{
38+
mAlgorithm.reset( algorithm->create() );
39+
if ( !( mAlgorithm && mAlgorithm->prepare( mParameters, context, mFeedback ) ) )
40+
cancel();
41+
}
42+
catch ( QgsProcessingException &e )
43+
{
44+
QgsMessageLog::logMessage( e.what(), QObject::tr( "Processing" ), Qgis::Critical );
45+
mFeedback->reportError( e.what() );
3846
cancel();
47+
}
3948
}
4049

4150
void QgsProcessingAlgRunnerTask::cancel()
4251
{
43-
mFeedback->cancel();
52+
if ( mFeedback )
53+
mFeedback->cancel();
4454
QgsTask::cancel();
4555
}
4656

tests/src/python/test_qgsprocessingalgrunner.py

+14-3
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,21 @@
2828
QgsProcessingAlgRunnerTask,
2929
QgsProcessingAlgorithm,
3030
QgsProject,
31+
QgsProcessingFeedback,
3132
)
3233

3334
start_app()
3435

3536

37+
class ConsoleFeedBack(QgsProcessingFeedback):
38+
39+
_error = ''
40+
41+
def reportError(self, error, fatalError=False):
42+
self._error = error
43+
print(error)
44+
45+
3646
class CrashingProcessingAlgorithm(QgsProcessingAlgorithm):
3747
"""
3848
Wrong class in factory createInstance()
@@ -89,10 +99,11 @@ def test_bad_script_dont_crash(self): # spellok
8999

90100
context = QgsProcessingContext()
91101
context.setProject(QgsProject.instance())
92-
with self.assertRaises(Exception) as e:
93-
QgsProcessingAlgRunnerTask(CrashingProcessingAlgorithm(), {}, context=context)
102+
feedback = ConsoleFeedBack()
94103

95-
self.assertEqual(str(e.exception), 'unknown')
104+
task = QgsProcessingAlgRunnerTask(CrashingProcessingAlgorithm(), {}, context=context, feedback=feedback)
105+
self.assertTrue(task.isCanceled())
106+
self.assertEqual(feedback._error, 'Error creating algorithm from createInstance()')
96107

97108

98109
if __name__ == '__main__':

0 commit comments

Comments
 (0)