Gibt es eine Möglichkeit, GDAL-Ausnahmen in Python korrekt auszulösen?

12

Ich arbeite mit GDAL in Python und wollte, dass GDAL Ausnahmen auslöst, damit ich damit etwas Nützliches anfangen kann. Wenn zum Beispiel eine Datei nicht mit gdal.Open () geöffnet werden kann, möchte ich eine Ausnahme auslösen, anstatt dass gdal None zurückgibt. Ich möchte nur eine Möglichkeit, die Fehler zu erfassen, anstatt sie in der Datei sys.stdout abzulegen.

Derzeit habe ich versucht, die gdal.UseExceptions()Funktion zu verwenden, bin jedoch auf ein Problem gestoßen. Wenn gdal.UseExceptions()gesetzt, scheint es bestimmte Fehler zu verbergen und keine Ausnahme für sie auszulösen. Zum Beispiel ERROR 5: Access window out of range in RasterIO() Requested (1,15) of size 25x3 on raster of 26x17verschwindet und es wird keine Ausnahme ausgelöst. Das scheint ziemlich gefährlich zu sein.

Irgendwelche Ideen sind dankbar.

Doug
quelle
1
Doug - ziemlich ähnlich der Frage, die ich heute Morgen zu OGR / Postgres-Fehlern gestellt habe (Link unten). Die (hackische) Art und Weise, wie wir mit dem GDAL-Fehlerproblem umgehen, besteht darin, alles, was mit GDAL / OGR verbunden ist, auf None zu setzen und dann mithilfe einer benutzerdefinierten Fehlerklasse einen bestimmten Fehler über die Verbindung auszulösen, wenn der Wert nach der GDAL / OGR-Operation immer noch ist Keiner. gis.stackexchange.com/questions/30607/…
Tomas
1
Ich habe ein Ticket eingereicht, wie im Kommentar unten empfohlen. Es kann hier verfolgt werden: ( trac.osgeo.org/gdal/ticket/4800 )
Doug

Antworten:

10
/*
** We do not want to interfere with warnings or debug messages since
** they won't be translated into exceptions.
*/
if (eclass == CE_Warning || eclass == CE_Debug ) {
    pfnPreviousHandler(eclass, code, msg );
}

Der UseExceptions-Handler überwacht nur CE_Error oder CE_Fatal. Was Sie sehen, ist wahrscheinlich eine CE_Warning- oder CE_Debug-Nachricht (überprüfen Sie den Rückgabewert Ihres Funktionsaufrufs, um zu sehen, was er ist).

Dieser Kompromiss wurde eingegangen, um sicherzustellen, dass sich die "neuen" Python-Bindungen ähnlich wie die "alten" Python-Bindungen verhielten (die von Hand gerollt wurden, wobei alle Fehlerbehandlungen vom Typ "check-the-return" waren). Ich bin damit einverstanden, dass diese Art saugt.

Fühlen Sie sich frei, ein Ticket einzureichen, damit wir Levels für den Ausnahmehandler hinzufügen können, auf die er ua hören kann

UseExceptions(level=CE_Warning)
UseExceptions(level=CE_Debug)
Howard Butler
quelle
1
Vielen Dank für die Antwort, dies ist absolut sinnvoll und ich werde versuchen, ein Ticket einzureichen und den Link hier zu posten!
Doug