Excepciones en plpython

Oswaldo Hernández listas en soft-com.es
Mar Mayo 6 22:04:44 CEST 2008


Chema Cortes escribió:
> El 2008/5/6 Oswaldo Hernández <listas en soft-com.es> escribió:
> 
>>  Estoy haciendo una funciones en plpython (PostgreSQL) y no consiguo
>> capturar correctamente las excepciones de la base de datos, es decir,
>>
>>  En una funcion:
>>
>>  try:
>>     plpy.execute("select .......")
>>  except Exception, e:
>>     plpy.error("Error ejecucion:<%s>, %s" % (e.__class__, str(e))
>>
>>  Si se produce un error del lado de la base de datos (sql erroneo, etc ..)
>> siempre me tira la misma excepción, sea cual sea el error:
>>     "Error execute <<type 'exceptions.SystemError'>>, error return without
>> exception set",
> 
> Según la documentación, plpy.error() siempre lanza una excepción
> python, responsable del final de la transacción que se está ejecutando
> al no ser interceptada. No creo que sea éso lo que quieras hacer.
> 

Hola Chema,

No, el problema es que no puedo cancelar las excepciones de Postgres. El except las captura, pero si 
quieres cancelarla no puedes, siempre aborta y lanza la excepción.
Esto solo pasa con las excepciones del SPI, con las excepciones normales de python si funciona bien.

CREATE OR REPLACE FUNCTION pruebas.pytest3() RETURNS integer AS
$BODY$

try:
     rws = plpy.execute("select 1/0")

except Exception, e:
     plpy.notice("Error:", str(e))

return 1

$BODY$
LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER

Esta funcion deberia capturar la excepcion de Postgres, emitir un notice y hacer un return 1 sin mas 
consecuencias, sin embargo el resultado es:

select pruebas.pytest3()

WARNING:  plpython: in function pytest3:
DETALLE:  <class 'plpy.SPIError'>: Unknown error in PLy_spi_execute_query
NOTICE:  ('Error:', 'error return without exception set')

ERROR:  división por cero
CONTEXTO:  sentencia SQL: «select 1/0»


He localizado el codigo de plpython y hay unos comentarios del autor sobre este tema.
<http://doxygen.postgresql.org/plpython_8c-source.html>
(linea: 270)


Gracias por tu respuesta.
Saludos,

-- 
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************
PD:
Antes de imprimir este mensaje, asegúrese de que es necesario.
El medio ambiente está en nuestra mano.
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es