Generar códigos de error
Miguel Ángel Vilela
miguev en gulic.org
Mie Sep 11 00:37:25 CEST 2002
On Tue, Sep 10, 2002 at 11:29:34PM +0200, Pablo Ruiz Múzquiz wrote:
> Mi respuesta es muy simple:
>
> Programa asegurándote de que no puede haber errores. Espera, espera,
> no me refiero a eso.
Jeje, más quisiera que no hubiera errores... pero mi script trabaja
sobre un terreno resbaladizo y no puedo pasarlos por encima. Estoy
harto de que cada vez que no hay condiciones ideales salte una
excepción.
Mis scripts son unos apaños para crear, borrar y modificar cuentas de
usuario en cantidades industriales. Por ejemplo ahora cuando empiece
el curso me envían una lista de 200 a 300 usuarios, y tengo que darles
de alta en el /etc/passwd, en Samba, en MySQL, crearles un Maildir,
etc. Como son muchos usuarios y varios servicios no centralizados
(ojalá lo tuviera centralizado con LDAP), estoy tirando de scripts.
Antes usaba createusers (http://www.lfsp.org) pero se me quedó corto,
de hecho tuve que modificarlo porque no sabía Python ni tenía tiempo.
Ahora estoy usando mis scripts (http://blusa.sf.net) porque me resulta
mucho más cómodo añadir cosas, y ni punto de comparación programar en
Python con programar en Bash.
Para que me entiendan, por vergüenza no había contado esto antes 0:-)
> Quiero decir que las comprobaciones deben estar pensadas dentro de
> un entorno de invariantes con asserts y demás.
¿? <- Me pillas con la neurona cansada
> Es decir, en vez de ir a lo loco haciendo tests, es mejor reconducir
> los datos por un único camino para que lleguen limpios de porquería
> al final. Por eso digo lo de los invariantes (programación por
> contrato). Si tú vas asegurando que se cumplen ciertas condiciones
> en los datos que vas moviendo de lugar, tendrás un control bastante
> bueno.
Los test van en dos o tres funciones, y son precisamente para poder
asegurarme de que las demás funciones trabajarán sobre condiciones
seguras, para dejarles el terreno preparado. Un ejemplo:
Quiero añadir en MySQL el usuario 'fulanito' para que acceda desde
localhost.
Antes:
cur.execute ("insert into user values (...)) --> _mysql.expections...
Ahora:
errs = user.test_create () <-- Hace las comprobaciones y devuelve
una tupla con los mensajes de error
(pero me faltan los códigos de error)
if errs:
print "Hubo %d errores:\n" % len(errs)
for err in errs:
print err
else:
user.create ()
> Las excepciones te pueden servir para estas cosas (lo digo porque
> parece que las desechas). Ten en cuenta que las excepciones tiene
> nombre y apellidos y aparte de poder reconocerlas puedes inventarte
> tus propias excepciones (considera las excepciones como parte de tu
> control sobre los datos, no son algo malo en sí como el GOTO ;-)).
Una de las primeras cosas que implementé en mis clases fueron las
excepciones, para poder controlar las situaciones de error cazándolas
con nuestros queridos try. Ahora lo que quiero es anticiparme a estas
excepciones.
En el ejemplo anterio, SÉ que si intento meter un par (user,host) en
mysql que ya existe, saltará la excepción de que la entrada está
duplicada. Puedo cazarla con un try, pero me resulta más útil saber
con antelación que eso va a suceder, y así puedo arreglarlo diciéndole
al script que lo borre y lo vuelva a crear.
Mi idea es poner en el script blusacreateusers algo como esto:
# Crea un objeto usuario, con login generado a partir del nombre,
# contraseña aleatoria y grupo "nogroup"
user = blusaUser ('Fulanito el de los palotes')
errs = user.test_create () # Esto sería --test para crearlos
# pero también lo habría para borrarlos
if errs:
print "Hubo %d errores:\n" % len(errs)
for err in errs:
print err
if test:
# El script ha recibido la opción --test, así que
# sólo intentará averiguar si podría crear el usuario.
return None
else:
# Se procede a crear el usuario
user.create ()
En realidad pondría
if not test:
try:
user.create ()
except blusaUserError, why:
print "Algo falló:\n", why
> En fin. A lo mejor no era esto lo que preguntabas pero ahí te queda
> eso ;-)
Si resulta que estamos de acuerdo, pero como digo poco hacerca de lo
que hago pues no lo parece.
> PS: nos volvemos a encontrar ;-)
Ya me extrañaba no recordar haberte leido aquí...
te encuentro hasta en la sopa :-D
--
--==-- --==-- Miguel Ángel Vilela --==-- --==--
a.k.a miguev at fmat.ull.es, GULiC, Barrapunto & IRC-Hispano
GULiC - Grupo de Usuarios Linux de Canarias - http://www.gulic.org
Curso de Introducción a Linux para Alumnos - http://cila.gulic.org
Alumno en la Fac. de Matemáticas - http://www.fmat.ull.es/~miguev/
Public GPG key at http://search.keyserver.net (search for: miguev)
Linux Reg. User #184518 - Debian GNU/Linux SID - kernel 2.4.18-xfs
-- Linux Driver Petition #73209 --- No ePatents Petition #80354 --
Many a man in love with a dimple makes the mistake of marrying the
whole girl.
-- Stephen Leacock
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: no disponible
Type: application/pgp-signature
Size: 189 bytes
Desc: no disponible
URL: <http://mail.python.org/pipermail/python-es/attachments/20020910/055788be/attachment.pgp>
Más información sobre la lista de distribución Python-es