Python'da GDAL zam istisnalarını düzgün bir şekilde almanın bir yolu var mı?


12

Python'da GDAL ile çalışıyorum ve GDAL ile istisnaları arttırmak istedim, böylece onlarla yararlı bir şeyler yapabilirim. Örneğin bir dosya gdal.Open () ile açılamıyorsa, gdal döndüren Yok yerine bir istisna atmak istiyorum. Sadece sys.stdout atılıyor yerine hataları yakalamak için bir yol istiyorum.

Şu anda gdal.UseExceptions()işlevi kullanmayı denedim ama bir sorunla karşılaştı. Ayarlandığında gdal.UseExceptions()belirli hataları gizliyor ve bunlarda bir istisna oluşturmuyor gibi görünüyor. Örneğin ERROR 5: Access window out of range in RasterIO() Requested (1,15) of size 25x3 on raster of 26x17kaybolur ve istisna yoktur. Bu oldukça tehlikeli görünüyor.

Herhangi bir fikir takdir, teşekkürler.


1
Doug - Bu sabah OGR / Postgres hataları hakkında sorduğum soruya oldukça benzer (aşağıdaki bağlantı). GDAL hata sorununu ele almamızın (hackish) yolu, GDAL / OGR'ye bağlanan her şeyi Yok olarak ayarlamak ve daha sonra GDAL / OGR işleminden sonra değer hala devam ediyorsa, bağlantı hakkında belirli bir hata oluşturmak için özel bir hata sınıfı kullanmaktır. Yok. gis.stackexchange.com/questions/30607/…
Tomas

1
Aşağıdaki yorum tarafından tavsiye edildiği gibi bir bilet verdim. Buradan takip edilebilir: ( trac.osgeo.org/gdal/ticket/4800 )
Doug

Yanıtlar:


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 işleyicisi CE_Error veya CE_Fatal dışında bir şey dinlemez. Gördüğünüz şey muhtemelen bir CE_Warning veya CE_Debug mesajıdır (neye eşit olduğunu görmek için işlevsel çağrınızın dönüş değerini kontrol edin).

Bu uzlaşma, "yeni" python bağlarının "eski" python bağlarına benzer şekilde davrandığından emin olmak için yapıldı (ki burada tüm hata işleme-dönüş-kontrol türünde olan elle yuvarlanır). Bu tür berbatlara katılıyorum.

İstisna işleyicisinin dinlemesi için seviyeler ekleyebilmemiz için bir bilet göndermekten çekinmeyin, ala

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

1
Cevabınız için teşekkürler, bu tamamen mantıklı ve bir bilet dosyalamaya ve bağlantıyı buraya göndermeye çalışacağım!
Doug
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.