8 votos

¿Cómo detectar un GDAL/OGR ' ADVERTENCIA '?

  • Al ejecutar una secuencia de comandos por lotes usando un GDAL/OGR programa, puedo detectar si ha ocurrido un error comprobando ERRORLEVEL para el valor 1.

  • Cuando el uso de GDAL/OGR en python o .NETA, me da una excepción cuando se produce un error.

Pregunta:
¿Cómo detectar si un Warning fue emitido durante la ejecución?


Por qué?
A pesar de que un proceso puede ejecutar hasta el final a pesar de las advertencias, el resultado podría estar dañado con respecto a los datos que esperar. Se podría argumentar que debo comprobar estas corrupciones, pero desde que tengo el control de todo el proceso, me gustaría ser capaz de parar cuando se emite una advertencia.

1voto

Lucas Puntos 128

Si el uso de GDAL 1.10+ los enlaces python permite especificar una de python que se puede llamar como un controlador de errores. Sin embargo, estos controladores de error aparecen para ser llamado en un hilo separado y en las excepciones planteadas no se propagan al subproceso principal. Así que algo como esto no va a funcionar:

from osgeo import gdal

def error_handler(err_level, err_no, err_msg):

    if err_class >= gdal.CE_Warning:
        raise RuntimeError(err_level, err_no, err_msg) #this exception does not propagate back to main thread!
    else: print err_msg

if __name__=='__main__':

    #Test custom error handler
    gdal.PushErrorHandler(error_handler)
    gdal.Error(gdal.CE_Warning,2,'test warning message')
    gdal.PopErrorHandler()

Pero usted puede hacer algo como esto:

from osgeo import gdal

class GdalErrorHandler(object):
    def __init__(self):
        self.err_level=gdal.CE_None
        self.err_no=0
        self.err_msg=''

    def handler(self, err_level, err_no, err_msg):
        self.err_level=err_level
        self.err_no=err_no
        self.err_msg=err_msg

if __name__=='__main__':

    err=GdalErrorHandler()
    handler=err.handler # Note don't pass class method directly or python segfaults
                        # due to a reference counting bug 
                        # http://trac.osgeo.org/gdal/ticket/5186#comment:4

    gdal.PushErrorHandler(handler)
    gdal.UseExceptions() #Exceptions will get raised on anything >= gdal.CE_Failure

    try:
        gdal.Error(gdal.CE_Warning,1,'gdal.CE_Warning warning')
    except Exception as e:
        print 'Operation raised an exception'
        print e
    else:
        print 'No exception'
        if err.err_level >= gdal.CE_Warning:
            raise RuntimeError(err.err_level, err.err_no, err.err_msg)
    finally:
        print err.err_level, err.err_no, err.err_msg
        gdal.PopErrorHandler()

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X