Есть ли способ правильно заставить GDAL вызывать исключения в Python?

12

Я работаю с GDAL в Python и хотел, чтобы GDAL вызывал исключения, чтобы я мог сделать с ними что-то полезное. Например, если файл нельзя открыть с помощью gdal.Open (), я бы хотел выдать исключение вместо gdal, возвращающего None. Я просто хотел бы получить способ фиксировать ошибки, а не сбрасывать их в sys.stdout.

В настоящее время я пытался использовать gdal.UseExceptions()функцию, но столкнулся с проблемой. Когда gdal.UseExceptions()он установлен, кажется, что он скрывает определенные ошибки и не создает исключений для них. Например, ERROR 5: Access window out of range in RasterIO() Requested (1,15) of size 25x3 on raster of 26x17исчезает и не возникает никаких исключений. Это кажется довольно опасным.

Любые идеи приветствуются, спасибо.

Doug
источник
1
Даг - очень похоже на вопрос, который я задавал об ошибках OGR / Postgres сегодня утром (ссылка ниже). (Хакерский) способ решения проблемы ошибок GDAL - установить для всего, что подключается к GDAL / OGR, значение None, а затем использовать пользовательский класс ошибок, чтобы вызвать конкретную ошибку в соединении, если после операции GDAL / OGR значение по-прежнему Никто. gis.stackexchange.com/questions/30607/…
Томас
1
Я подал заявку в соответствии с комментарием ниже. Это можно отследить здесь: ( trac.osgeo.org/gdal/ticket/4800 )
Даг

Ответы:

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

Обработчик UseExceptions не слушает ничего, кроме CE_Error или CE_Fatal. Вероятно, вы видите сообщение CE_Warning или CE_Debug (проверьте возвращаемое значение вашего функционального вызова, чтобы увидеть, чему оно равно).

Этот компромисс был сделан для того, чтобы убедиться, что «новые» привязки python ведут себя так же, как и «старые» привязки python (которые были обработаны вручную со всей обработкой ошибок, относящейся к типу проверки возврата). Я согласен, что это отстой.

Не стесняйтесь подать заявку, чтобы мы могли добавить уровни для обработчика исключений для прослушивания, аля

UseExceptions(level=CE_Warning)
UseExceptions(level=CE_Debug)
Говард Батлер
источник
1
Спасибо за ответ, это полностью имеет смысл, и я постараюсь перейти к заполнению заявки и публикации ссылки здесь!
Дуг