¿Hay alguna manera de que GDAL genere excepciones en Python?

12

Estoy trabajando con GDAL en Python y he querido que GDAL genere excepciones para poder hacer algo útil con ellos. Por ejemplo, si un archivo no se puede abrir con gdal.Open (), me gustaría lanzar una excepción en lugar de que gdal devuelva None. Solo me gustaría una forma de capturar los errores en lugar de que se viertan en sys.stdout.

Actualmente he intentado usar la gdal.UseExceptions()función pero me encontré con un problema. Cuando gdal.UseExceptions()se establece, parece ocultar ciertos errores y no generar una excepción en ellos. Por ejemplo, ERROR 5: Access window out of range in RasterIO() Requested (1,15) of size 25x3 on raster of 26x17desaparece y no se genera ninguna excepción. Esto parece bastante peligroso.

Cualquier idea es apreciada, gracias.

Doug
fuente
1
Doug: bastante similar a la pregunta que hice sobre los errores de OGR / Postgres esta mañana (enlace a continuación). La forma (hack) de manejar el problema del error GDAL es establecer todo lo que se conecta a GDAL / OGR en None y luego usar una clase de error personalizada para generar un error específico sobre la conexión, si después de la operación GDAL / OGR el valor sigue siendo Ninguna. gis.stackexchange.com/questions/30607/…
Tomas el
1
Archivé un ticket como lo recomienda el comentario a continuación. Puede rastrearse aquí: ( trac.osgeo.org/gdal/ticket/4800 )
Doug

Respuestas:

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 );
}

El controlador UseExceptions no escucha nada más que CE_Error o CE_Fatal. Lo que está viendo es probablemente un mensaje CE_Warning o CE_Debug (verifique el valor de retorno de su llamada funcional para ver a qué equivale).

Este compromiso se hizo para garantizar que los enlaces "nuevos" de Python se comportaran de manera similar a los enlaces "viejos" de Python (que se enrollaban a mano con todo el manejo de errores del tipo de comprobación de devolución). Estoy de acuerdo en que este tipo de apesta.

Siéntase libre de presentar un ticket para que podamos agregar niveles para que el controlador de excepciones escuche, ala

UseExceptions(level=CE_Warning)
UseExceptions(level=CE_Debug)
Howard Butler
fuente
1
Gracias por la respuesta, esto tiene mucho sentido e intentaré presentar un ticket y publicar el enlace aquí.
Doug