Чи є спосіб правильно 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зникає, і виняток не піднімається. Це здається досить небезпечним.

Будь-які ідеї оцінені, дякую.


1
Дуг - досить схожий на питання, яке я запитав про помилки OGR / Postgres сьогодні вранці (посилання нижче). (Хакітний) спосіб вирішення проблеми помилок GDAL - це встановити все, що підключається до GDAL / OGR, до None, а потім використовувати спеціальний клас помилок для підняття конкретної помилки щодо з'єднання, якщо після операції GDAL / OGR значення все ще Жоден. gis.stackexchange.com/questions/30607/…
Томаш

1
Я подав квиток, як рекомендовано коментарем нижче. Його можна відстежити тут: ( trac.osgeo.org/gdal/ticket/4800 )
Doug

Відповіді:


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 (перевірте значення повернення функціонального виклику, щоб побачити, що воно рівне).

Цей компроміс був зроблений для того, щоб переконатися, що "нові" прив'язки пітона поводяться аналогічно "старим" прив'язкам пітона (які вручну прокатуються з усіма помилками керування типу "повернення-повернення"). Я погоджуюся з таким відстій.

Не соромтеся подати квиток, щоб ми могли додати рівні для обробника винятків для прослуховування, ала

UseExceptions(level=CE_Warning)
UseExceptions(level=CE_Debug)

1
Дякую за відповідь, це абсолютно має сенс, і я спробую перейти до оформлення квитка та розміщення посилання тут!
Даг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.