¿Cómo detectar una 'Advertencia' GDAL / OGR?

8
  • Cuando ejecuto un script por lotes usando un programa GDAL / OGR , puedo detectar si ocurrió un error al verificar ERRORLEVELel valor 1.

  • Cuando uso GDAL / OGR en python o .NET , obtengo una excepción cuando ocurre un error.

Pregunta:
¿Cómo detecto si Warningse emitió un mensaje durante la ejecución?


¿Por qué?
Aunque un proceso puede ejecutarse hasta el final a pesar de las advertencias, la salida puede estar corrupta con respecto a los datos que espero. Se podría argumentar que debo verificar estas corrupciones, pero como tengo el control de todo el proceso, me gustaría poder detenerme cuando se emita una advertencia.

Chau
fuente
Puede modificar el comportamiento de manejo de errores en el nivel C (vea gdal.org/cpl__error_8h.html ), incluyendo convertir advertencias en errores y configurar manejadores de errores. Sin embargo, no veo nada que lo exponga a API que no sean C.
BradHards
1
¿Creo que esta pregunta es más adecuada para hacerla en stackoverflow.com ?
nickves
@BradHards : Preferiría no sumergirme en el código C y compilar las cosas por mí mismo.
Chau
1
@nickves : He hecho la pregunta aquí porque espero que las personas que usan GDAL / OGR usen este foro.
Chau

Respuestas:

3

Si usa GDAL 1.10+, los enlaces de Python le permiten especificar un Python invocable como un controlador de errores . Sin embargo, estos controladores de errores parecen llamarse en un subproceso separado y las excepciones generadas no se propagan al subproceso principal . Entonces algo como esto no 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 puedes 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()
usuario2856
fuente