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