Wie erkenne ich eine GDAL / OGR-Warnung?

8
  • Wenn ich ein Batch-Skript mit einem GDAL / OGR- Programm ausführe, kann ich anhand ERRORLEVELdes Werts 1 feststellen, ob ein Fehler aufgetreten ist .

  • Bei Verwendung von GDAL / OGR in Python oder .NET wird eine Ausnahme angezeigt , wenn ein Fehler auftritt.

Frage:
Wie erkenne ich, ob Warningwährend der Ausführung eine ausgegeben wurde?


Warum?
Obwohl ein Prozess trotz Warnungen bis zum Ende ausgeführt werden kann, ist die Ausgabe möglicherweise in Bezug auf die von mir erwarteten Daten beschädigt. Sie könnten argumentieren, dass ich nach diesen Beschädigungen suchen sollte, aber da ich die Kontrolle über den gesamten Prozess habe, möchte ich in der Lage sein, zu stoppen, wenn eine Warnung ausgegeben wird.

Chau
quelle
Sie können das Fehlerbehandlungsverhalten auf C-Ebene ändern (siehe gdal.org/cpl__error_8h.html ), einschließlich der Umwandlung von Warnungen in Fehler und der Einstellung von Fehlerbehandlungsroutinen. Ich sehe jedoch nichts, was dies Nicht-C-APIs aussetzen könnte.
BradHards
1
Ich denke, diese Frage ist besser geeignet , um auf stackoverflow.com gestellt zu werden ?
Nickves
@BradHards : Ich würde lieber nicht in den C-Code eintauchen und das Zeug selbst kompilieren.
Chau
1
@nickves : Ich habe die Frage hier gestellt, weil ich erwarte, dass die Leute, die GDAL / OGR verwenden, dieses Forum nutzen.
Chau

Antworten:

3

Wenn Sie GDAL 1.10+ verwenden, können Sie mit den Python-Bindungen einen Python angeben, der als Fehlerbehandlungsroutine aufgerufen werden kann . Diese Fehlerbehandlungsroutinen scheinen jedoch in einem separaten Thread aufgerufen zu werden, und alle ausgelösten Ausnahmen werden nicht an den Hauptthread zurückgegeben . So etwas funktioniert also nicht:

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

Aber Sie können so etwas tun:

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
quelle