<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mundo Geek &#187; finally</title>
	<atom:link href="http://mundogeek.net/etiqueta/finally/feed/" rel="self" type="application/rss+xml" />
	<link>http://mundogeek.net</link>
	<description>Mundo geek, bitácora sobre todo lo geek: software, gadgets, tecnología, internet, ...</description>
	<lastBuildDate>Fri, 25 May 2012 14:51:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Python: Excepciones</title>
		<link>http://mundogeek.net/archivos/2008/03/19/python-excepciones/</link>
		<comments>http://mundogeek.net/archivos/2008/03/19/python-excepciones/#comments</comments>
		<pubDate>Wed, 19 Mar 2008 10:00:14 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[else]]></category>
		<category><![CDATA[excepciones]]></category>
		<category><![CDATA[except]]></category>
		<category><![CDATA[finally]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[try]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2008/03/19/python-excepciones/</guid>
		<description><![CDATA[Las excepciones son errores detectados por Python durante la ejecución del programa. Cuando el intérprete se encuentra con una situación excepcional, como el intentar dividir un número entre 0 o el intentar acceder a un archivo que no existe, este genera o lanza una excepción, informando al usuario de que existe algún problema. Si la [...]]]></description>
			<content:encoded><![CDATA[<p>Las excepciones son errores detectados por Python durante la ejecución del programa. Cuando el intérprete se encuentra con una situación excepcional, como el intentar dividir un número entre 0 o el intentar acceder a un archivo que no existe, este genera o lanza una excepción, informando al usuario de que existe algún problema.</p>
<p>Si la excepción no se captura el flujo de ejecución se interrumpe y se muestra la información asociada a la excepción en la consola de forma que el programador pueda solucionar el problema.<br />
<span id="more-1413"></span><br />
Veamos un pequeño programa que lanzaría una excepción al intentar dividir 1 entre 0.</p>
<pre class="code"><span class="pythonStatement">def</span> <span class="Identifier">division</span>(a, b):
    <span class="pythonStatement">return</span> a / b

<span class="pythonStatement">def</span> <span class="Identifier">calcular</span>():
    division(1, 0)

calcular()</pre>
<p>Si lo ejecutamos obtendremos el siguiente mensaje de error:</p>
<p class="code">$ python ejemplo.py<br />
Traceback (most recent call last):<br />
  File &#8220;ejemplo.py&#8221;, line 7, in <module><br />
    calcular()<br />
  File &#8220;ejemplo.py&#8221;, line 5, in calcular<br />
    division(1, 0)<br />
  File &#8220;ejemplo.py&#8221;, line 2, in division<br />
    a / b<br />
ZeroDivisionError: integer division or modulo by zero</p>
<p>Lo primero que se muestra es el trazado de pila o traceback, que consiste en una lista con las llamadas que provocaron la excepción. Como vemos en el trazado de pila, el error estuvo causado por la llamada a <code>calcular()</code> de la línea 7, que a su vez llama a <code>division(1, 0)</code> en la línea 5 y en última instancia por la ejecución de la sentencia <code>a / b</code> de la línea 2 de <code>division</code>.</p>
<p>A continuación vemos el tipo de la excepción, <code>ZeroDivionError</code>, junto a una descripción del error: &#8220;integer division or modulo by zero&#8221; (módulo o división entera entre cero).</p>
<p>En Python se utiliza una construcción <code>try</code>-<code>except</code> para capturar y tratar las excepciones. El bloque <code>try</code> (intentar) define el fragmento de código en el que creemos que podría producirse una excepción. El bloque <code>except</code> (excepción) permite indicar el tratamiento que se llevará a cabo de producirse dicha excepción. Muchas veces nuestro tratamiento de la excepción consistirá simplemente en imprimir un mensaje más amigable para el usuario, otras veces nos interesará registrar los errores y de vez en cuando podremos establecer una estrategia de resolución del problema.</p>
<p>En el siguiente ejemplo intentamos crear un objeto <code>f</code> de tipo fichero. De no existir el archivo pasado como parámetro, se lanza una excepción de tipo <code>IOError</code>, que capturamos gracias a nuestro <code>try</code>-<code>except</code>.</p>
<pre class="code"><span class="pythonStatement">try</span>:
    f = file(<span class="Normal">&quot;</span><span class="String">archivo.txt</span><span class="Normal">&quot;</span>)
<span class="pythonStatement">except</span>:
    <span class="pythonStatement">print</span> <span class="Normal">&quot;</span><span class="String">El archivo no existe</span><span class="Normal">&quot;</span></pre>
<p>Python permite utilizar varios <code>except</code> para un solo bloque <code>try</code>, de forma que podamos dar un tratamiento distinto a la excepción dependiendo del tipo de excepción de la que se trate. Esto es una buena práctica, y es tan sencillo como indicar el nombre del tipo a continuación del <code>except</code>.</p>
<pre class="code"><span class="pythonStatement">try</span>:
    num = int(<span class="Normal">&quot;</span><span class="String">3a</span><span class="Normal">&quot;</span>)
    <span class="pythonStatement">print</span> no_existe
<span class="pythonStatement">except</span> NameError:
    <span class="pythonStatement">print</span> <span class="Normal">&quot;</span><span class="String">La variable no existe</span><span class="Normal">&quot;</span>
<span class="pythonStatement">except</span> ValueError:
    <span class="pythonStatement">print</span> <span class="Normal">&quot;</span><span class="String">El valor no es un numero</span><span class="Normal">&quot;</span></pre>
<p>Cuando se lanza una excepción en el bloque <code>try</code>, se busca en cada una de las clausulas <code>except</code> un manejador adecuado para el tipo de error que se produjo. En caso de que no se encuentre, se propaga la excepción.</p>
<p>Además podemos hacer que un mismo <code>except</code> sirva para tratar más de una excepción usando una tupla para listar los tipos de error que queremos que trate el bloque:</p>
<pre class="code"><span class="pythonStatement">try</span>:
    num = int(<span class="Normal">&quot;</span><span class="String">3a</span><span class="Normal">&quot;</span>)
    <span class="pythonStatement">print</span> no_existe
<span class="pythonStatement">except</span> (NameError, ValueError):
    <span class="pythonStatement">print</span> <span class="Normal">&quot;</span><span class="String">Ocurrio un error</span><span class="Normal">&quot;</span></pre>
<p>La construcción <code>try</code>-<code>except</code> puede contar además con una clausula <code>else</code>, que define un fragmento de código a ejecutar sólo si no se ha producido ninguna excepción en el <code>try</code>.</p>
<pre class="code"><span class="pythonStatement">try</span>:
    num = 33
<span class="pythonStatement">except</span>:
    <span class="pythonStatement">print</span> <span class="Normal">&quot;</span><span class="String">Hubo un error!</span><span class="Normal">&quot;</span>
<span class="pythonConditional">else</span>:
    <span class="pythonStatement">print</span> <span class="Normal">&quot;</span><span class="String">Todo esta bien</span><span class="Normal">&quot;</span></pre>
<p>También existe una clausula <code>finally</code> que se ejecuta siempre, se produzca o no una excepción. Esta clausula se suele utilizar, entre otras cosas, para tareas de limpieza.</p>
<pre class="code"><span class="pythonStatement">try</span>:
    z = x / y
<span class="pythonStatement">except</span> ZeroDivisionError:
    <span class="pythonStatement">print</span> <span class="Normal">&quot;</span><span class="String">Division por cero</span><span class="Normal">&quot;</span>
<span class="pythonStatement">finally</span>:
    <span class="pythonStatement">print</span> <span class="Normal">&quot;</span><span class="String">Limpiando...</span><span class="Normal">&quot;</span></pre>
<p>También es interesante comentar que como programadores podemos crear y lanzar nuestras propias excepciones. Basta crear una clase que herede de <code>Exception</code> o cualquiera de sus hijas y lanzarla con <code>raise</code>.</p>
<pre class="code"><span class="pythonStatement">class</span> <span class="Identifier">MiError</span>(Exception):
    <span class="pythonStatement">def</span> <span class="Identifier">__init__</span>(self, valor):
        self.valor = valor

    <span class="pythonStatement">def</span> <span class="Identifier">__str__</span>(self):
        <span class="pythonStatement">return</span> <span class="Normal">&quot;</span><span class="String">Error </span><span class="Normal">&quot;</span> + str(self.valor)

<span class="pythonStatement">try</span>:
    <span class="pythonConditional">if</span> resultado &gt; 20:
        <span class="pythonStatement">raise</span> MiError(33)
<span class="pythonStatement">except</span> MiError, e:
    <span class="pythonStatement">print</span> e</pre>
<p>Por último, a continuación se listan las excepciones disponibles por defecto, así como la clase de la que deriva cada una de ellas entre paréntesis.</p>
<ul>
<li>BaseException: Clase de la que heredan todas las excepciones.</li>
<li>Exception(BaseException): Super clase de todas las excepciones que no sean de salida.</li>
<li>GeneratorExit(Exception): Se pide que se salga de un generador.</li>
<li>StandarError(Exception): Clase base para todas las excepciones que no tengan que ver con salir del intérprete.</li>
<li>ArithmeticError(StandardError): Clase base para los errores aritméticos.</li>
<li>FloatingPointError(ArithmeticError): Error en una operación de coma flotante.</li>
<li>OverflowError(ArithmeticError): Resultado demasiado grande para poder representarse.</li>
<li>ZeroDivisionError(ArithmeticError): Lanzada cuando el segundo argumento de una operación de división o módulo era 0</li>
<li>AssertionError(StandardError): Falló la condición de un estamento assert.</li>
<li>AttributeError(StandardError): No se encontró el atributo.</li>
<li>EOFError(StandardError): Se intentó leer más allá del final de fichero.</li>
<li>EnvironmentError(StandardError): Clase padre de los errores relacionados con la entrada/salida.</li>
<li>IOError(EnvironmentError): Error en una operación de entrada/salida.</li>
<li>OSError(EnvironmentError): Error en una llamada a sistema.</li>
<li>WindowsError(OSError):  Error en una llamada a sistema en Windows.</li>
<li>ImportError(StandardError): No se encuentra el módulo o el elemento del módulo que se quería importar.</li>
<li>LookupError(StandardError): Clase padre de los errores de acceso.</li>
<li>IndexError(LookupError): El índice de la secuencia está fuera del rango posible.</li>
<li>KeyError(LookupError): La clave no existe.</li>
<li>MemoryError(StandardError): No queda memoria suficiente.</li>
<li>NameError(StandardError): No se encontró ningún elemento con ese nombre.</li>
<li>UnboundLocalError(NameError): El nombre no está asociado a ninguna variable.</li>
<li>ReferenceError(StandardError): El objeto no tiene ninguna referencia fuerte apuntando hacia él.</li>
<li>RuntimeError(StandardError): Error en tiempo de ejecución no especificado.</li>
<li>NotImplementedError(RuntimeError): Ese método o función no está implementado.</li>
<li>SyntaxError(StandardError): Clase padre para los errores sintácticos.</li>
<li>IndentationError(SyntaxError): Error en la indentación del archivo.</li>
<li>TabError(IndentationError): Error debido a la mezcla de espacios y tabuladores.</li>
<li>SystemError(StandardError): Error interno del intérprete.</li>
<li>TypeError(StandardError): Tipo de argumento no apropiado.</li>
<li>ValueError(StandardError): Valor del argumento no apropiado.</li>
<li>UnicodeError(ValueError): Clase padre para los errores relacionados con unicode.</li>
<li>UnicodeDecodeError(UnicodeError): Error de decodificación unicode.</li>
<li>UnicodeEncodeError(UnicodeError): Error de codificación unicode.</li>
<li>UnicodeTranslateError(UnicodeError): Error de traducción unicode.</li>
<li>StopIteration(Exception): Se utiliza para indicar el final del iterador.</li>
<li>Warning(Exception): Clase padre para los avisos.</li>
<li>DeprecationWarning(Warning): Clase padre para avisos sobre características obsoletas.</li>
<li>FutureWarning(Warning): Aviso. La semántica de la construcción cambiará en un futuro.</li>
<li>ImportWarning(Warning): Aviso sobre posibles errores a la hora de importar.</li>
<li>PendingDeprecationWarning(Warning): Aviso sobre características que se marcarán como obsoletas en un futuro próximo.</li>
<li>RuntimeWarning(Warning): Aviso sobre comportmaientos dudosos en tiempo de ejecución.</li>
<li>SyntaxWarning(Warning): Aviso sobre sintaxis dudosa.</li>
<li>UnicodeWarning(Warning): Aviso sobre problemas relacionados con Unicode, sobre todo con problemas de conversión.</li>
<li>UserWarning(Warning): Clase padre para avisos creados por el programador.</li>
<li>KeyboardInterrupt(BaseException): El programa fué interrumpido por el usuario.</li>
<li>SystemExit(BaseException): Petición del intérprete para terminar la ejecución.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2008/03/19/python-excepciones/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

