QgsRasterFileWriter: improve error reporting

This commit is contained in:
Even Rouault 2019-09-15 23:48:25 +02:00 committed by Nyall Dawson
parent 7e3c9d98e2
commit 5e70084d32
5 changed files with 68 additions and 3 deletions

View File

@ -71,6 +71,17 @@ parameter indicates the file path for the written file(s).
%Docstring
Emitted when an error occurs which prevented the file being written (or if
the task is canceled). The writing ``error`` will be reported.
.. deprecated:: since QGIS 3.10. Use errorOccurred(int, const QString&)
%End
void errorOccurred( int error, const QString &errorMessage );
%Docstring
Emitted when an error occurs which prevented the file being written (or if
the task is canceled). The writing ``error`` will be reported and a
``errorMessage`` will be potentially set.
.. versionadded:: 3.10
%End
protected:

View File

@ -7816,12 +7816,24 @@ QString QgisApp::saveAsRasterFile( QgsRasterLayer *rasterLayer, const bool defau
} );
// when an error occurs:
connect( writerTask, &QgsRasterFileWriterTask::errorOccurred, this, [ = ]( int error )
connect( writerTask, qgis::overload< int, const QString &>::of( &QgsRasterFileWriterTask::errorOccurred ), this, [ = ]( int error, const QString & errorMessage )
{
if ( error != QgsRasterFileWriter::WriteCanceled )
{
QString errorCodeStr;
if ( error == QgsRasterFileWriter::SourceProviderError )
errorCodeStr = tr( "source provider" );
else if ( error == QgsRasterFileWriter::DestProviderError )
errorCodeStr = tr( "destination provider" );
else if ( error == QgsRasterFileWriter::CreateDatasourceError )
errorCodeStr = tr( "data source creation" );
else if ( error == QgsRasterFileWriter::WriteError )
errorCodeStr = tr( "write error" );
QString fullErrorMsg( tr( "Cannot write raster. Error code: %1" ).arg( errorCodeStr ) );
if ( !errorMessage.isEmpty() )
fullErrorMsg += "\n" + errorMessage;
QMessageBox::warning( this, tr( "Save Raster" ),
tr( "Cannot write raster. Error code: %1" ).arg( error ),
fullErrorMsg,
QMessageBox::Ok );
}
} );

View File

@ -323,16 +323,28 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster( const Qgs
}
if ( !destProvider->isValid() )
{
if ( feedback && !destProvider->error().isEmpty() )
{
feedback->appendError( destProvider->error().summary() );
}
return CreateDatasourceError;
}
if ( nCols != destProvider->xSize() || nRows != destProvider->ySize() )
{
QgsDebugMsg( QStringLiteral( "Created raster does not have requested dimensions" ) );
if ( feedback )
{
feedback->appendError( QObject::tr( "Created raster does not have requested dimensions" ) );
}
return CreateDatasourceError;
}
if ( nBands != destProvider->bandCount() )
{
QgsDebugMsg( QStringLiteral( "Created raster does not have requested band count" ) );
if ( feedback )
{
feedback->appendError( QObject::tr( "Created raster does not have requested band count" ) );
}
return CreateDatasourceError;
}
if ( nBands )
@ -583,21 +595,37 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeImageRaster( QgsRaste
}
if ( !destProvider->isValid() )
{
if ( feedback && !destProvider->error().isEmpty() )
{
feedback->appendError( destProvider->error().summary() );
}
return CreateDatasourceError;
}
if ( nCols != destProvider->xSize() || nRows != destProvider->ySize() )
{
QgsDebugMsg( QStringLiteral( "Created raster does not have requested dimensions" ) );
if ( feedback )
{
feedback->appendError( QObject::tr( "Created raster does not have requested dimensions" ) );
}
return CreateDatasourceError;
}
if ( nOutputBands != destProvider->bandCount() )
{
QgsDebugMsg( QStringLiteral( "Created raster does not have requested band count" ) );
if ( feedback )
{
feedback->appendError( QObject::tr( "Created raster does not have requested band count" ) );
}
return CreateDatasourceError;
}
if ( Qgis::Byte != destProvider->dataType( 1 ) )
{
QgsDebugMsg( QStringLiteral( "Created raster does not have requested data type" ) );
if ( feedback )
{
feedback->appendError( QObject::tr( "Created raster does not have requested data type" ) );
}
return CreateDatasourceError;
}
}

View File

@ -66,7 +66,13 @@ void QgsRasterFileWriterTask::finished( bool result )
if ( result )
emit writeComplete( mWriter.outputUrl() );
else
{
emit errorOccurred( mError );
QString errorMsg;
if ( !mFeedback->errors().isEmpty() )
errorMsg = mFeedback->errors().front();
emit errorOccurred( mError, errorMsg );
}
}

View File

@ -81,9 +81,18 @@ class CORE_EXPORT QgsRasterFileWriterTask : public QgsTask
/**
* Emitted when an error occurs which prevented the file being written (or if
* the task is canceled). The writing \a error will be reported.
* \deprecated since QGIS 3.10. Use errorOccurred(int, const QString&)
*/
void errorOccurred( int error );
/**
* Emitted when an error occurs which prevented the file being written (or if
* the task is canceled). The writing \a error will be reported and a
* \a errorMessage will be potentially set.
* \since QGIS 3.10
*/
void errorOccurred( int error, const QString &errorMessage );
protected:
bool run() override;
@ -105,7 +114,6 @@ class CORE_EXPORT QgsRasterFileWriterTask : public QgsTask
QgsRasterFileWriter::WriterError mError = QgsRasterFileWriter::NoError;
QgsCoordinateTransformContext mTransformContext;
};
#endif //QGSRASTERFILEWRITERTASK_H