Crear clases dinamicamente
Alexis Roda
alexis.roda.villalonga en gmail.com
Mar Ene 2 21:59:33 CET 2007
En/na Oswaldo Hernández ha escrit:
> CVA escribió:
>> Hola a todos. Al ver el "Subject" del mail, me surgio la duda: Cual es
>> la utilidad o en que casos seria necesario o beneficioso crear una
>> nueva clase en tiempo de ejecución?
>>
>
> Mi interes por hacerlo esta facilitarme a nivel de aplicación la gestión
> de excepciones de PostgreSQL (psycopg2)
>
> Explico lo que estoy tratando de realizar:
>
> Tengo una diccionario de tuplas con sq1state, nombre de clase de error y
> descipcion "entendible":
>
> ERRORESPG = {
> "23505" : ("unique_violation", "Intento de duplicar un registro que
> ya existe."),
> "23514" : ("check_violation", "El valor no cumple las condiciones
> impuestas.")
> etc ...
> }
>
>
> Una clase base de Errores
> class PgError(Exception):
> def __init__(self, baseError, msg = "Excepcion en base de datos",
> Detalles = ""):
> self.ErrorOriginal = baseError
> self.msg = msg + Detalles
> def __str__(self):
> return self.msg
>
> Una función para gestionar este diccionario que recibe el error original
> y lo transforma en otro mas detallado, como la excepcion debe ser una
> clase, la crea dinámicamente y la devuelve como nueva clase de error:
Las excepciones también pueden ser instancias. Dependiendo de tus
necesidades podrías instanciar PgError directamente en lugar de crear
una clase para cada error.
El "problema" de este enfoque monoclase es que en un try ... except ...
no puedes distinguir la causa del error, todos son PgError. En la
práctica no se si realmente es necesaria esta granularidad tan fina a la
hora de distinguir excepciones. Personalmente encuentro problemático
tratar de controlar todos los errores que se pueden producir al hacer un
simple update, por ejemplo:
try:
# ejecutar update
except unique_violation, check_violation, error de sintaxis SQL, funcion
no definida, campo no existente, formato de fecha erróneo, error en
trigger, error de E/S ...
mas teniendo en cuenta que posiblemente el programa no pueda hacer nada
cuando se produce una excepción, aparte de informar del error y abortar
la ejecución. ¿ Que ocurrirá cuando los desarrolladores de postgres
incluyan un nuevo error y tu no lo reflejes en ERRORESPG ?
Por lo que respecta a la pregunta original, te recomendaría utilizar
new.classobj():
clase_error = new.classobj("unique_violation", (PgError, ), {})
instancia = clase_error(error, msg, detalle)
Saludos
Más información sobre la lista de distribución Python-es