Apakah ada cara untuk membuat GDAL dengan benar meningkatkan pengecualian dalam Python?

12

Saya bekerja dengan GDAL dengan Python dan ingin mendapatkan GDAL untuk meningkatkan pengecualian sehingga saya dapat melakukan sesuatu yang berguna dengan mereka. Sebagai contoh jika file tidak dapat dibuka dengan gdal.Open () Saya ingin melempar pengecualian daripada mengembalikan gdal Tidak ada. Saya hanya ingin cara untuk menangkap kesalahan daripada dibuang ke sys.stdout.

Saat ini saya telah mencoba menggunakan gdal.UseExceptions()fungsi tetapi menemukan masalah. Ketika gdal.UseExceptions()diatur tampaknya menyembunyikan kesalahan tertentu dan tidak memunculkan pengecualian pada mereka. Misalnya ERROR 5: Access window out of range in RasterIO() Requested (1,15) of size 25x3 on raster of 26x17menghilang dan tidak ada pengecualian yang dimunculkan. Ini sepertinya cukup berbahaya.

Ada ide yang dihargai, terima kasih.

Doug
sumber
1
Doug - mirip dengan pertanyaan yang saya ajukan tentang kesalahan OGR / Postgres pagi ini (tautan di bawah). Cara (meretas) kami menangani masalah kesalahan GDAL adalah dengan mengatur segala sesuatu yang terhubung ke GDAL / OGR ke Tidak ada dan kemudian menggunakan kelas kesalahan khusus untuk meningkatkan kesalahan spesifik tentang koneksi, jika setelah operasi GDAL / OGR nilainya masih Tidak ada gis.stackexchange.com/questions/30607/…
Tomas
1
Saya mengajukan tiket seperti yang direkomendasikan oleh komentar di bawah ini. Itu dapat dilacak di sini: ( trac.osgeo.org/gdal/ticket/4800 )
Doug

Jawaban:

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

Handler UseExceptions tidak mendengarkan apa pun selain CE_Error, atau CE_Fatal. Apa yang Anda lihat mungkin adalah pesan CE_Warning atau CE_Debug (periksa nilai kembalinya panggilan fungsional Anda untuk melihat apa artinya itu).

Kompromi ini dibuat untuk memastikan bahwa binding python "baru" berperilaku serupa dengan binding python "lama" (yang digulung dengan semua penanganan kesalahan dari tipe check-the-return). Saya setuju ini menyebalkan.

Jangan ragu untuk mengajukan tiket sehingga kami dapat menambahkan level untuk penangan pengecualian untuk didengarkan, ala

UseExceptions(level=CE_Warning)
UseExceptions(level=CE_Debug)
Howard Butler
sumber
1
Terima kasih atas jawabannya, ini sangat masuk akal dan saya akan mencoba untuk mengajukan tiket dan memposting tautan di sini!
Doug