Re: Errores Personalizados

From: Santiago Zarate <santiago(at)zarate(dot)net(dot)ve>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Errores Personalizados
Date: 2009-01-11 07:24:49
Message-ID: a37e9c560901102324w68c21ca0q2b649f7c1e5ff228@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

A ver... si entendi bien lo que quieres es quitar un mensaje generico
y decir algo mas "especifico" en el contexto del error... e.j:

insert into tabla values (1, 'un texto');

si el servidor da un mensaje de error SQLXXXYZ, tu quieres decirle al
usuario "tal cosa ya existe en la tabla"

estoy seguro que en todos los lenguajes de programacion cuando
interactuas con una base de datos, generalemnte el driver o la
interfaz que utilizas para interactuar con la base de datos te permite
capturar los errores... alvaro ya te ha dicho varias veces esto...
(asi como otros que siguen el hilo)

la forma (mas sana) que yo veo para _resolver_ este problemita seria:

1: Identificar los mensajes de error que se quiera personalizar
3: Crear una tabla (en base de datos) o enum/array (del lado de la
aplicacion) y relacionar codigos de error +mensajes de servidor con un
registro en el enum matriz, o tabla en base de datos y el mensaje
definido por usuario
4: Revisar en la documentacion del driver la forma de leer los
mensajes de error enviados por el servidor
5: escribir las excepciones correspondientes en la aplicacion al
momento de ejecutar una consulta (select, insert, delete, etc) a la
base de datos...
6: en caso de que la consulta no sea exitosa, lanzar la excepcion y el
correspondiente mensaje

aca te dejo un ejemplo de una solucion en python claramente no es la
mejor, ni esta escrita de lo lindo... pero creo que podria daros una
idea de como resolver el problema

#!/bin/env python
import psycopg2
import sys
errorMessages= {
'OperationalError': "Hay un problema operacional, el
password es incorrecto",
'ProgrammingError': "Se trato de seleccionar un campo
que no existe."
}

try:
databaseConnection = psycopg2.connect("dbname='onuva' user='onuva'
host='localhost' password='unpasswordquenovaafuncionar'")
dbCursor = databaseConnection.cursor()

except psycopg2.OperationalError: # aca el password resulto invalido
print errorMessages['OperationalError'] # se lanza el mensaje de
error dependiendo de lo que
# arroja la exception
print 'Saliendo del programa'
sys.exit()

try:
userKey = 1
sqlString = 'UPDATE usuarios set vetado=FALSE where id =
'+str(userKey) # El campo vetado no existe
dbCursor.execute(sqlString)

except psycopg2.ProgrammingError: # en este caso la
sentencia falla y lanza esta exception
# al capturarla se busca
el mensaje de error requerido
# en caso de desear que
todo esto fuera por base de datos
# es decir que los
mensajes se alojen en una tabla en db
# pues solo quedaria
agregar el error correspondiente
print errorMessages['ProgrammingError']+'\nLa sentencia SQL
utilizada fue :\n\t\t%s' % sqlString
print 'Saliendo del programa'
sys.exit()

de cualquier modo, lei mas arriba que lo estabas haciendo en .net
http://npgsql.projects.postgresql.org/docs/api/ aca esta la
documentacion revisa NpgsqlError supongo que seria suficiente para
hacer todo esto...

Otra forma podria ser modificando el codigo fuente de postgresql y
cambiar los codigos y mensajes de error... (aunque esto probablemente
traeria muchos otros problemas... creo...

2009/1/10 Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>:
> Calabaza escribió:
>> 2009/1/9 Juan Ramirez <juanrmiranda(at)hotmail(dot)com>:
>> >
>> >> From: calalinux(at)gmail(dot)com
>> >> Mira este hilo del archivo:
>> >> http://archives.postgresql.org/pgsql-es-ayuda/2008-05/msg00385.php
>> >
>> > no me es funcional, porque de esa manera me obliga a crear una
>> > función para cada cosa,
>>
>> de las funciones no te vas a salvar si quieres hacer eso :)
>
> No es cierto; se puede hacer sin funciones (aunque no enteramente en el
> lado del servidor).
>
> --
> Alvaro Herrera http://www.amazon.com/gp/registry/3BP7BYG9PUGI8
> "Postgres is bloatware by design: it was built to house
> PhD theses." (Joey Hellerstein, SIGMOD annual conference 2002)
> --
> TIP 7: no olvides aumentar la configuración del "free space map"
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Santiago Zarate 2009-01-11 09:41:55 Re: Errores Personalizados
Previous Message Gabriel Hermes Colina Zambra 2009-01-11 01:03:51 Re: Abriendo el Paragua, 64 bits