Como detectar um 'aviso' de GDAL / OGR?

8
  • Quando executo um script em lote usando um programa GDAL / OGR , posso detectar se ocorreu um erro verificando ERRORLEVELo valor 1.

  • Ao usar GDAL / OGR em python ou .NET , recebo uma exceção quando ocorre um erro.

Pergunta:
Como detecto se um Warningfoi emitido durante a execução?


Por quê?
Mesmo que um processo possa ser executado até o fim, apesar dos avisos, a saída pode estar corrompida com relação aos dados que eu espero. Você poderia argumentar que eu deveria verificar essas corrupções, mas como tenho controle de todo o processo, gostaria de poder parar quando um aviso for emitido.

Chau
fonte
Você pode modificar o comportamento de manipulação de erros no nível C (consulte gdal.org/cpl__error_8h.html ), incluindo transformar avisos em erros e definir manipuladores de erros. Não vejo nada que exponha isso a APIs não-C.
BradHards
1
Eu acho que essa pergunta é mais adequada para ser feita no stackoverflow.com ?
nickves
@ BradHards : Eu preferiria não mergulhar no código C e compilar as coisas sozinho .
Chau
1
@ Nickves : Eu fiz a pergunta aqui porque espero que as pessoas que usam o GDAL / OGR estejam usando este fórum.
Chau

Respostas:

3

Se você estiver usando o GDAL 1.10+, as ligações python permitem especificar um python que pode ser chamado como manipulador de erros . No entanto, esses manipuladores de erro parecem ser chamados em um thread separado e quaisquer exceções levantadas não se propagam de volta para o thread principal . Então, algo assim não 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()

Mas você pode fazer algo assim:

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()
user2856
fonte