Existe uma maneira de o GDAL gerar exceções corretamente no Python?

12

Estou trabalhando com o GDAL em Python e queria que o GDAL levantasse exceções para que eu pudesse fazer algo útil com elas. Por exemplo, se um arquivo não puder ser aberto com gdal.Open (), eu gostaria de lançar uma exceção em vez de gdal retornar None. Gostaria apenas de uma maneira de capturar os erros em vez de serem despejados no sys.stdout.

Atualmente, tentei usar a gdal.UseExceptions()função, mas me deparei com um problema. Quando gdal.UseExceptions()está definido, parece ocultar certos erros e não gerar uma exceção neles. Por exemplo, ERROR 5: Access window out of range in RasterIO() Requested (1,15) of size 25x3 on raster of 26x17desaparece e nenhuma exceção é levantada. Isso parece muito perigoso.

Todas as idéias são apreciadas, obrigado.

Doug
fonte
1
Doug - bem parecido com a pergunta que fiz sobre erros de OGR / Postgres hoje de manhã (link abaixo). A maneira (hackeada) de lidar com a questão do erro GDAL é definir tudo que se conecta ao GDAL / OGR como None e, em seguida, usar uma classe de erro personalizada para gerar um erro específico sobre a conexão, se após a operação GDAL / OGR o valor ainda estiver Nenhum. gis.stackexchange.com/questions/30607/…
Tomas
1
Eu enviei um ticket como recomendado pelo comentário abaixo. Pode ser rastreado aqui: ( trac.osgeo.org/gdal/ticket/4800 )
Doug

Respostas:

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

O manipulador UseExceptions não escuta nada além de CE_Error ou CE_Fatal. O que você está vendo é provavelmente uma mensagem CE_Warning ou CE_Debug (verifique o valor de retorno da sua chamada funcional para ver o que é igual).

Esse compromisso foi feito para garantir que as "novas" ligações python se comportassem da mesma forma que as "antigas" ligações python (que eram roladas manualmente com todo o tratamento de erros do tipo verificar o retorno). Eu concordo que esse tipo de merda.

Sinta-se à vontade para registrar um ticket para que possamos adicionar níveis para o manipulador de exceções ouvir, ala

UseExceptions(level=CE_Warning)
UseExceptions(level=CE_Debug)
Howard Butler
fonte
1
Obrigado pela resposta, isso faz totalmente sentido e vou tentar registrar um ticket e postar o link aqui!
Doug