Di mana saya dapat menemukan kode kesalahan PostGIS?


8

Menggunakan ST_Containsdalam whereklausa terkadang memberi saya pesan kesalahan seperti

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

Untuk saat ini saya tidak dapat menjamin validitas untuk setiap geometri di DB, menggunakan alat impor pihak ketiga, jadi saya hanya menangkap setiap pengecualian:

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;

Saya ingin tahu di mana pengecualian seperti TopologyException benar-benar berada dan kondisi pengecualian mana yang harus saya gunakan, bukan OTHERS?

Jawaban:


3

Dengan asumsi Anda dapat mereproduksi kesalahan, Anda dapat dengan mudah mendapatkan kode kesalahan yang tepat:

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;
$$

(Masukkan geometri Anda yang sebenarnya, tentu saja.)

Menjalankan ini akan mencetak kode dan pesan kesalahan.

Saya tidak melakukan ST_Contains, tetapi sebagai contoh, saya mendapatkan hasil ini dari yang TopologyExceptionsaya temui:

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

Daftar kode kesalahan PostgreSQL mengatakan itu XX000adalah "internal_error". Dugaan terbaik saya adalah ini hanya kode yang digunakan PostgreSQL ketika acak, kode asli pihak ketiga meledak, karena PostgreSQL tidak bisa berbuat banyak dengan kesalahan-kesalahan itu. Mungkin patut mendapatkan di milis PostGIS dan melihat apakah mereka dapat melakukan sesuatu untuk setidaknya memberikan kesalahan PostGIS umum kode yang lebih spesifik.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.