Esiste un modo per far sì che GDAL generi eccezioni in Python?


12

Sto lavorando con GDAL in Python e ho voluto convincere GDAL a sollevare eccezioni in modo da poter fare qualcosa di utile con loro. Ad esempio, se un file non può essere aperto con gdal.Open (), vorrei lanciare un'eccezione invece che gdal restituisca None. Vorrei solo un modo per catturare gli errori anziché scaricarli su sys.stdout.

Attualmente ho provato a utilizzare la gdal.UseExceptions()funzione ma ho riscontrato un problema. Quando gdal.UseExceptions()è impostato sembra nascondere alcuni errori e non sollevare un'eccezione su di essi. Ad esempio ERROR 5: Access window out of range in RasterIO() Requested (1,15) of size 25x3 on raster of 26x17scompare e non viene sollevata alcuna eccezione. Questo sembra piuttosto pericoloso.

Tutte le idee sono apprezzate, grazie.


1
Doug - abbastanza simile alla domanda che ho posto sugli errori OGR / Postgres questa mattina (link sotto). Il modo (hacker) di gestire il problema dell'errore GDAL è impostare tutto ciò che si collega a GDAL / OGR su Nessuno e quindi utilizzare una classe di errore personalizzata per generare un errore specifico sulla connessione, se dopo l'operazione GDAL / OGR il valore è ancora Nessuna. gis.stackexchange.com/questions/30607/…
Tomas

1
Ho depositato un biglietto come raccomandato dal commento qui sotto. Può essere rintracciato qui: ( trac.osgeo.org/gdal/ticket/4800 )
Doug

Risposte:


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

Il gestore UseExceptions non ascolta altro che CE_Error o CE_Fatal. Quello che stai vedendo è probabilmente un messaggio CE_Warning o CE_Debug (controlla il valore di ritorno della tua chiamata funzionale per vedere a cosa equivale).

Questo compromesso è stato fatto per assicurarsi che i "nuovi" binding di Python si comportassero in modo simile ai "vecchi" binding di Python (che erano fatti a mano con tutti gli errori di gestione del tipo check-the-return). Sono d'accordo che questo tipo di schifo.

Sentiti libero di presentare un ticket in modo da poter aggiungere i livelli che il gestore delle eccezioni può ascoltare, ala

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

1
Grazie per la risposta, questo ha perfettamente senso e cercherò di arrivare a presentare un biglietto e a pubblicare il link qui!
Doug
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.