Skip to content

Commit 5339d62

Browse files
committed
[processing] More helpful errors when sources cannot be loaded
Include descriptive text with the specified parameter value in error, and always check that sources were loaded to avoid raw Python exceptions when they are not
1 parent 199af26 commit 5339d62

File tree

95 files changed

+469
-43
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+469
-43
lines changed

python/core/processing/qgsprocessingalgorithm.sip.in

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,32 @@ Evaluates the parameter with matching ``name`` to a range of values.
744744
QStringList parameterAsFields( const QVariantMap &parameters, const QString &name, QgsProcessingContext &context ) const;
745745
%Docstring
746746
Evaluates the parameter with matching ``name`` to a list of fields.
747+
%End
748+
749+
static QString invalidSourceError( const QVariantMap &parameters, const QString &name );
750+
%Docstring
751+
Returns a user-friendly string to use as an error when a source parameter could
752+
not be loaded.
753+
754+
The ``parameters`` argument should give the algorithms parameter map, and the ``name``
755+
should correspond to the invalid source parameter name.
756+
757+
.. versionadded:: 3.2
758+
759+
.. seealso:: :py:func:`invalidSinkError`
760+
%End
761+
762+
static QString invalidSinkError( const QVariantMap &parameters, const QString &name );
763+
%Docstring
764+
Returns a user-friendly string to use as an error when a sink parameter could
765+
not be created.
766+
767+
The ``parameters`` argument should give the algorithms parameter map, and the ``name``
768+
should correspond to the invalid source parameter name.
769+
770+
.. versionadded:: 3.2
771+
772+
.. seealso:: :py:func:`invalidSourceError`
747773
%End
748774

749775
private:

python/plugins/processing/algs/gdal/Buffer.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
QgsProcessingParameterField,
3333
QgsProcessingParameterString,
3434
QgsProcessingParameterNumber,
35+
QgsProcessingException,
3536
QgsProcessingParameterBoolean,
3637
QgsProcessingParameterVectorDestination)
3738
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
@@ -103,7 +104,10 @@ def commandName(self):
103104
return 'ogr2ogr'
104105

105106
def getConsoleCommands(self, parameters, context, feedback, executing=True):
106-
fields = self.parameterAsSource(parameters, self.INPUT, context).fields()
107+
source = self.parameterAsSource(parameters, self.INPUT, context)
108+
if source is None:
109+
raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT))
110+
fields = source.fields()
107111
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
108112
geometry = self.parameterAsString(parameters, self.GEOMETRY, context)
109113
distance = self.parameterAsDouble(parameters, self.DISTANCE, context)

python/plugins/processing/algs/gdal/ClipVectorByExtent.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
from qgis.core import (QgsVectorLayer,
2929
QgsProcessing,
30+
QgsProcessingException,
3031
QgsProcessingParameterDefinition,
3132
QgsProcessingParameterFeatureSource,
3233
QgsProcessingParameterExtent,
@@ -80,6 +81,9 @@ def commandName(self):
8081
def getConsoleCommands(self, parameters, context, feedback, executing=True):
8182
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
8283
source = self.parameterAsSource(parameters, self.INPUT, context)
84+
if source is None:
85+
raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT))
86+
8387
extent = self.parameterAsExtent(parameters, self.EXTENT, context, source.sourceCrs())
8488
options = self.parameterAsString(parameters, self.OPTIONS, context)
8589
outFile = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)

python/plugins/processing/algs/gdal/Dissolve.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
__revision__ = '$Format:%H$'
2727

2828
from qgis.core import (QgsProcessing,
29+
QgsProcessingException,
2930
QgsProcessingParameterDefinition,
3031
QgsProcessingParameterFeatureSource,
3132
QgsProcessingParameterField,
@@ -113,7 +114,11 @@ def commandName(self):
113114
return 'ogr2ogr'
114115

115116
def getConsoleCommands(self, parameters, context, feedback, executing=True):
116-
fields = self.parameterAsSource(parameters, self.INPUT, context).fields()
117+
source = self.parameterAsSource(parameters, self.INPUT, context)
118+
if source is None:
119+
raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT))
120+
121+
fields = source.fields()
117122
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
118123
geometry = self.parameterAsString(parameters, self.GEOMETRY, context)
119124
fieldName = self.parameterAsString(parameters, self.FIELD, context)

python/plugins/processing/algs/gdal/OffsetCurve.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
QgsProcessingParameterDistance,
3131
QgsProcessingParameterFeatureSource,
3232
QgsProcessingParameterString,
33+
QgsProcessingException,
3334
QgsProcessingParameterNumber,
3435
QgsProcessingParameterVectorDestination)
3536
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
@@ -86,7 +87,11 @@ def commandName(self):
8687
return 'ogr2ogr'
8788

8889
def getConsoleCommands(self, parameters, context, feedback, executing=True):
89-
fields = self.parameterAsSource(parameters, self.INPUT, context).fields()
90+
source = self.parameterAsSource(parameters, self.INPUT, context)
91+
if source is None:
92+
raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT))
93+
94+
fields = source.fields()
9095
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
9196
geometry = self.parameterAsString(parameters, self.GEOMETRY, context)
9297
distance = self.parameterAsDouble(parameters, self.DISTANCE, context)

python/plugins/processing/algs/gdal/OneSideBuffer.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
__revision__ = '$Format:%H$'
2727

2828
from qgis.core import (QgsProcessing,
29+
QgsProcessingException,
2930
QgsProcessingParameterDefinition,
3031
QgsProcessingParameterDistance,
3132
QgsProcessingParameterFeatureSource,
@@ -112,7 +113,11 @@ def commandName(self):
112113
return 'ogr2ogr'
113114

114115
def getConsoleCommands(self, parameters, context, feedback, executing=True):
115-
fields = self.parameterAsSource(parameters, self.INPUT, context).fields()
116+
source = self.parameterAsSource(parameters, self.INPUT, context)
117+
if source is None:
118+
raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT))
119+
120+
fields = source.fields()
116121
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
117122
geometry = self.parameterAsString(parameters, self.GEOMETRY, context)
118123
distance = self.parameterAsDouble(parameters, self.DISTANCE, context)

python/plugins/processing/algs/gdal/PointsAlongLines.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525

2626
__revision__ = '$Format:%H$'
2727

28-
from qgis.core import (QgsProcessingParameterFeatureSource,
28+
from qgis.core import (QgsProcessingException,
29+
QgsProcessingParameterFeatureSource,
2930
QgsProcessingParameterString,
3031
QgsProcessingParameterNumber,
3132
QgsProcessingParameterVectorDestination,
@@ -90,7 +91,11 @@ def commandName(self):
9091
return 'ogr2ogr'
9192

9293
def getConsoleCommands(self, parameters, context, feedback, executing=True):
93-
fields = self.parameterAsSource(parameters, self.INPUT, context).fields()
94+
source = self.parameterAsSource(parameters, self.INPUT, context)
95+
if source is None:
96+
raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT))
97+
98+
fields = source.fields()
9499
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing)
95100
distance = self.parameterAsDouble(parameters, self.DISTANCE, context)
96101
geometry = self.parameterAsString(parameters, self.GEOMETRY, context)

python/plugins/processing/algs/qgis/Aggregate.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ def parameterAsAggregates(self, parameters, name, context):
131131

132132
def prepareAlgorithm(self, parameters, context, feedback):
133133
source = self.parameterAsSource(parameters, self.INPUT, context)
134+
if source is None:
135+
raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT))
136+
134137
group_by = self.parameterAsExpression(parameters, self.GROUP_BY, context)
135138
aggregates = self.parameterAsAggregates(parameters, self.AGGREGATES, context)
136139

python/plugins/processing/algs/qgis/BarPlot.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
from qgis.core import (QgsProcessingParameterFeatureSource,
3333
QgsProcessingParameterField,
34+
QgsProcessingException,
3435
QgsProcessingParameterFileDestination)
3536
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
3637
from processing.tools import vector
@@ -72,6 +73,8 @@ def displayName(self):
7273

7374
def processAlgorithm(self, parameters, context, feedback):
7475
source = self.parameterAsSource(parameters, self.INPUT, context)
76+
if source is None:
77+
raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT))
7578

7679
namefieldname = self.parameterAsString(parameters, self.NAME_FIELD, context)
7780
valuefieldname = self.parameterAsString(parameters, self.VALUE_FIELD, context)

python/plugins/processing/algs/qgis/BasicStatistics.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
QgsStringStatisticalSummary,
3636
QgsDateTimeStatisticalSummary,
3737
QgsFeatureRequest,
38+
QgsProcessingException,
3839
QgsProcessingParameterFeatureSource,
3940
QgsProcessingParameterField,
4041
QgsProcessingParameterFileDestination,
@@ -128,6 +129,9 @@ def displayName(self):
128129

129130
def processAlgorithm(self, parameters, context, feedback):
130131
source = self.parameterAsSource(parameters, self.INPUT_LAYER, context)
132+
if source is None:
133+
raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT))
134+
131135
field_name = self.parameterAsString(parameters, self.FIELD_NAME, context)
132136
field = source.fields().at(source.fields().lookupField(field_name))
133137

0 commit comments

Comments
 (0)