| You are here: Inicio > Inmersión en Python > Excepciones y gestión de ficheros | << >> | ||||
Inmersión en PythonPython de novato a experto |
|||||
En este capítulo se zambullirá en las excepciones, objetos de fichero, bucles for, y los módulos os y sys. Si ha usado excepciones en otros lenguaje de programación puede leer por encima la primera sección para hacerse con la sintaxis de Python. Pero asegúrese de prestar de nuevo sus cinco sentidos para la gestión de ficheros.
Como muchos otros lenguajes de programación, Python gestiona excepciones mediante bloques try...except.
| Python utiliza try...except para capturar las excepciones y raise para generarlas. Java y C++ usan try...catch para capturarlas, y throw para generarlas. | |
Las excepciones se las encuentra en todos lados en Python. Prácticamente cada módulo estándar de Python hace uso de ellas, y el propio Python las lanzará en muchas circunstancias diferentes. Ya las ha visto varias veces a lo largo de este libro.
En cada uno de estos casos estábamos jugando simplemente con el IDE de Python: ocurría un error, se mostraba la excepción (dependiendo del IDE, quizá en un tono de rojo intencionadamente irritante), y eso era todo. A esto se le denomina una excepción sin gestionar (unhandled). Cuando se lanzó la excepción, no había código explícito que lo advirtiese e hiciera algo al respecto, de manera que subió hasta la superficie y disparó el comportamiento por omisión de Python, que es mostrar algo de información para depuración y terminar la ejecución. En el IDE esto no es mucho problema, pero si ocurre mientras está ejecutándose un verdadero programa escrito en Python, todo el programa terminaría con un gran estrépito.
Una excepción no tiene por qué resultar en un completo desastre, sin embargo. Las excepciones, tras ser lanzadas, pueden ser controladas. Algunas veces ocurren excepciones debido a fallos en el programa (como acceder a una variable que no existe), pero a menudo sucede por algo que podemos anticipar. Si abrimos un fichero, puede ser que no exista. Si conectamos a una base de datos, puede que no esté disponible, o quizá no introdujimos las credenciales de seguridad correctas al acceder. Si sabe qué línea de código lanzará la excepción, podría gestionarla utilizando un bloque try...except.
>>> fsock = open("/noexiste", "r")Traceback (innermost last): File "<interactive input>", line 1, in ? IOError: [Errno 2] No such file or directory: '/noexiste' >>> try: ... fsock = open("/noexiste")
... except IOError:
... print "El fichero no existe, terminamos de forma elegante" ... print "Siempre se va a imprimir esta línea"
El fichero no existe, terminamos de forma elegante Siempre se va a imprimir esta línea
Las excepciones pueden parecer poco amigables (después de todo, si no las captura, el programa entero se va al traste), pero considere la alternativa. ¿Preferiría tener un objeto de fichero inútil sobre un fichero no existente? Necesitaría comprobar su validez de todas maneras, y si se olvidase, en algún momento por debajo de esa línea el programa mostraría errores extraños que debería trazar en el código fuente. Estoy seguro de que lo ha experimentado alguna vez, y sabe que no es divertido. Con las excepciones, el error ocurre de inmediato y puede controlarlo de una manera estándar en la fuente del problema.
Hay muchos otros usos para las excepciones aparte de controlar verdaderas condiciones de error. Un uso común en la biblioteca estándar de Python es intentar importar un módulo, y comprobar si funcionó. Importar un módulo que no existe lanzará una excepción ImportError. Puede usar esto para definir varios niveles de funcionalidad basándose en qué módulos están disponibles en tiempo de ejecución, o para dar soporte a varias plataformas (donde esté separado el código específico de cada plataforma en varios módulos).
También puede definir sus propias excepciones creando una clase que herede de la clase incorporada Exception, para luego lanzarlas con la orden raise. Vea la sección de lecturas complementarias si le interesa hacer esto.
El próximo ejemplo demuestra el uso de una excepción para dar soporte a funcionalidad específica de una plataforma. Este código viene en getpass, un módulo accesorio para obtener la clave del usuario. Esto se hace de manera diferente en las plataformas UNIX, Windows y Mac OS, pero el código encapsula todas esas diferencias.
# Asociamos el nombre getpass a la función apropiada try: import termios, TERMIOSexcept ImportError: try: import msvcrt
except ImportError: try: from EasyDialogs import AskPassword
except ImportError: getpass = default_getpass
else:
getpass = AskPassword else: getpass = win_getpass else: getpass = unix_getpass
<< Resumen |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
Trabajo con objetos de fichero >> |