Existe-t-il un moyen pour que GDAL déclenche correctement les exceptions en Python?

12

Je travaille avec GDAL en Python et j'ai voulu que GDAL lève des exceptions pour que je puisse faire quelque chose d'utile avec elles. Par exemple, si un fichier ne peut pas être ouvert avec gdal.Open (), je voudrais lever une exception au lieu de gdal renvoyant None. Je voudrais juste un moyen de capturer les erreurs au lieu de les vider dans sys.stdout.

Actuellement, j'ai essayé d'utiliser la gdal.UseExceptions()fonction mais j'ai rencontré un problème. Lorsqu'il gdal.UseExceptions()est défini, il semble masquer certaines erreurs et ne pas déclencher d'exception à leur sujet. Par exemple, ERROR 5: Access window out of range in RasterIO() Requested (1,15) of size 25x3 on raster of 26x17disparaît et aucune exception n'est levée. Cela semble assez dangereux.

Toutes les idées sont appréciées, merci.

Doug
la source
1
Doug - assez similaire à la question que j'ai posée ce matin sur les erreurs OGR / Postgres (lien ci-dessous). La façon (hackish) dont nous traitons le problème d'erreur GDAL est de définir tout ce qui se connecte à GDAL / OGR sur Aucun, puis d'utiliser une classe d'erreur personnalisée pour générer une erreur spécifique sur la connexion, si après l'opération GDAL / OGR la valeur est toujours Aucun. gis.stackexchange.com/questions/30607/…
Tomas
1
J'ai déposé un ticket comme recommandé par le commentaire ci-dessous. Il peut être suivi ici: ( trac.osgeo.org/gdal/ticket/4800 )
Doug

Réponses:

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

Le gestionnaire UseExceptions n'écoute rien d'autre que CE_Error ou CE_Fatal. Ce que vous voyez est probablement un message CE_Warning ou CE_Debug (vérifiez la valeur de retour de votre appel fonctionnel pour voir à quoi elle correspond).

Ce compromis a été fait pour s'assurer que les "nouvelles" liaisons Python se comportaient de la même manière que les "anciennes" liaisons Python (qui étaient roulées à la main avec toute la gestion des erreurs étant du type check-the-return). Je suis d'accord ce genre de suce.

N'hésitez pas à déposer un ticket afin que nous puissions ajouter des niveaux pour le gestionnaire d'exceptions à écouter, ala

UseExceptions(level=CE_Warning)
UseExceptions(level=CE_Debug)
Howard Butler
la source
1
Merci pour la réponse, cela a du sens et j'essaierai de déposer un ticket et de poster le lien ici!
Doug