Czy istnieje sposób, aby poprawnie zgłaszać wyjątki GDAL w Pythonie?

12

Pracuję z GDAL w Pythonie i chciałem, aby GDAL zgłaszał wyjątki, abym mógł zrobić z nimi coś pożytecznego. Na przykład, jeśli pliku nie można otworzyć za pomocą gdal.Open (), chciałbym zgłosić wyjątek zamiast gdal zwracającego None. Chciałbym po prostu uchwycić błędy zamiast zrzucania ich do sys.stdout.

Obecnie próbowałem użyć tej gdal.UseExceptions()funkcji, ale natknąłem się na problem. Po gdal.UseExceptions()ustawieniu wydaje się ukrywać niektóre błędy i nie zgłaszać wyjątków. Na przykład ERROR 5: Access window out of range in RasterIO() Requested (1,15) of size 25x3 on raster of 26x17znika i nie jest zgłaszany żaden wyjątek. To wydaje się dość niebezpieczne.

Dziękujemy za wszelkie pomysły.

Doug
źródło
1
Doug - całkiem podobne do pytania, które zadałem dziś rano o błędach OGR / Postgres (link poniżej). (Hackish) sposób, w jaki rozwiązujemy problem z błędem GDAL, polega na ustawieniu wszystkiego, co łączy się z GDAL / OGR na None, a następnie użyciu niestandardowej klasy błędów w celu podniesienia określonego błędu dotyczącego połączenia, jeśli po operacji GDAL / OGR wartość jest nadal Żaden. gis.stackexchange.com/questions/30607/…
Tomas
1
Złożyłem bilet zgodnie z zaleceniem w komentarzu poniżej. Można go śledzić tutaj: ( trac.osgeo.org/gdal/ticket/4800 )
Doug

Odpowiedzi:

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

Procedura obsługi UseExceptions nie nasłuchuje niczego innego niż CE_Error lub CE_Fatal. To, co widzisz, to prawdopodobnie komunikat CE_Warning lub CE_Debug (sprawdź wartość zwracaną swojego wywołania funkcjonalnego, aby zobaczyć, co to równa).

Ten kompromis został wprowadzony, aby upewnić się, że „nowe” powiązania w pythonie zachowywały się podobnie do „starych” powiązań w pythonie (które były przetwarzane ręcznie, a cała obsługa błędów była typu check-the-return). Zgadzam się, że to do bani.

Złóż zgłoszenie, abyśmy mogli dodawać poziomy dla procedury obsługi wyjątków do słuchania, ala

UseExceptions(level=CE_Warning)
UseExceptions(level=CE_Debug)
Howard Butler
źródło
1
Dzięki za odpowiedź, to całkowicie ma sens, a ja postaram się złożyć zgłoszenie i zamieścić link tutaj!
Doug