Bagaimana cara mendeteksi 'Peringatan' GDAL / OGR?

8
  • Ketika saya menjalankan skrip batch menggunakan program GDAL / OGR , saya dapat mendeteksi jika ada kesalahan dengan memeriksa ERRORLEVELnilai 1.

  • Saat menggunakan GDAL / OGR dalam python atau .NET , saya mendapatkan pengecualian ketika terjadi kesalahan.

Pertanyaan:
Bagaimana saya mendeteksi jika Warningdikeluarkan selama eksekusi?


Mengapa?
Meskipun suatu proses dapat berjalan sampai akhir meskipun ada peringatan, hasilnya mungkin rusak sehubungan dengan data yang saya harapkan. Anda dapat berdebat bahwa saya harus memeriksa korupsi ini, tetapi karena saya memiliki kendali atas seluruh proses, saya ingin dapat berhenti ketika peringatan dikeluarkan.

Chau
sumber
Anda dapat memodifikasi perilaku penanganan kesalahan di tingkat C (lihat gdal.org/cpl__error_8h.html ), termasuk mengubah peringatan menjadi kesalahan dan mengatur penangan kesalahan. Saya tidak melihat apa pun yang akan mengekspos itu ke API non-C.
BradHards
1
Saya pikir pertanyaan ini lebih pas untuk ditanyakan di stackoverflow.com ?
Nickves
@BradHards : Saya lebih suka tidak menyelam ke dalam kode C dan mengkompilasi barang-barang saya sendiri.
Chau
1
@nickves : Saya telah mengajukan pertanyaan di sini karena saya berharap orang-orang yang menggunakan GDAL / OGR menggunakan forum ini.
Chau

Jawaban:

3

Jika menggunakan GDAL 1.10+ binding python memungkinkan Anda menentukan python callable sebagai penangan kesalahan . Namun, penangan kesalahan ini tampaknya dipanggil di utas terpisah dan pengecualian apa pun yang diajukan tidak merambat kembali ke utas utama . Jadi sesuatu seperti ini tidak akan berfungsi:

from osgeo import gdal

def error_handler(err_level, err_no, err_msg):

    if err_class >= gdal.CE_Warning:
        raise RuntimeError(err_level, err_no, err_msg) #this exception does not propagate back to main thread!
    else: print err_msg

if __name__=='__main__':

    #Test custom error handler
    gdal.PushErrorHandler(error_handler)
    gdal.Error(gdal.CE_Warning,2,'test warning message')
    gdal.PopErrorHandler()

Tetapi Anda dapat melakukan sesuatu seperti ini:

from osgeo import gdal

class GdalErrorHandler(object):
    def __init__(self):
        self.err_level=gdal.CE_None
        self.err_no=0
        self.err_msg=''

    def handler(self, err_level, err_no, err_msg):
        self.err_level=err_level
        self.err_no=err_no
        self.err_msg=err_msg

if __name__=='__main__':

    err=GdalErrorHandler()
    handler=err.handler # Note don't pass class method directly or python segfaults
                        # due to a reference counting bug 
                        # http://trac.osgeo.org/gdal/ticket/5186#comment:4

    gdal.PushErrorHandler(handler)
    gdal.UseExceptions() #Exceptions will get raised on anything >= gdal.CE_Failure

    try:
        gdal.Error(gdal.CE_Warning,1,'gdal.CE_Warning warning')
    except Exception as e:
        print 'Operation raised an exception'
        print e
    else:
        print 'No exception'
        if err.err_level >= gdal.CE_Warning:
            raise RuntimeError(err.err_level, err.err_no, err.err_msg)
    finally:
        print err.err_level, err.err_no, err.err_msg
        gdal.PopErrorHandler()
pengguna2856
sumber