Onde posso encontrar códigos de erro PostGIS?


8

Usando ST_Containsna wherecláusula às vezes me dá mensagens de erro como

ERROR: GEOSContains: TopologyException: side location conflict at 37.3706 55.7882

Por enquanto, não posso garantir a validade de todas as geometrias no banco de dados, usando ferramentas de importação de terceiros, por isso apenas pego todas as exceções:

CREATE OR REPLACE FUNCTION safe_st_contains(geom1 geometry, geom2 geometry)
  RETURNS BOOL AS
  $$
  BEGIN
    RETURN ST_Contains($1, $2);
    EXCEPTION WHEN others THEN
      RAISE NOTICE 'TopologyException'; -- this is a guess
      RETURN FALSE;
  END;
  $$
LANGUAGE plpgsql;

Gostaria de saber onde realmente pertencem as exceções como TopologyException e quais condições de exceção devo usar em vez de OTHERS?

Respostas:


3

Supondo que você possa reproduzir o erro, você pode obter o código exato do erro com bastante facilidade:

DO $$
  BEGIN
    PERFORM ST_Contains('problem 1 geom here'::GEOMETRY, 'problem geom 2 here'::GEOMETRY);
    EXCEPTION WHEN others THEN
      RAISE NOTICE 'Error code: %', SQLSTATE;
      RAISE NOTICE 'Error message: %', SQLERRM;
  END;
$$

(Coloque suas geometrias reais, é claro.)

Ao executar isso, o código e a mensagem de erro serão impressos.

Eu não estava fazendo ST_Contains, mas como exemplo, obtive esse resultado de um determinado TopologyExceptionitem em que estou encontrando:

Error code: XX000
Error message: GEOSUnaryUnion: TopologyException: found non-noded intersection between LINESTRING (401336 4.79544e+06, 401336 4.79544e+06) and LINESTRING (401336 4.79544e+06, 401339 4.79543e+06) at 401336.24785627011 4795435.9978510197

A lista de códigos de erro do PostgreSQL diz que XX000é "internal_error". Meu melhor palpite é que esse é apenas o código que o PostgreSQL usa quando um código nativo aleatório de terceiros explode, pois o PostgreSQL não pode fazer muito com esses erros. Pode valer a pena entrar na lista de discussão do PostGIS e ver se eles podem fazer algo para, pelo menos, dar aos erros gerais do PostGIS um código mais específico.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.