{"id":391,"date":"2024-12-13T19:36:43","date_gmt":"2024-12-13T19:36:43","guid":{"rendered":"https:\/\/equipomedios.com\/blog\/?p=391"},"modified":"2024-10-18T19:38:47","modified_gmt":"2024-10-18T19:38:47","slug":"errores-y-excepciones-en-python","status":"publish","type":"post","link":"https:\/\/equipomedios.com\/blog\/errores-y-excepciones-en-python\/","title":{"rendered":"Errores y excepciones en Python"},"content":{"rendered":"<h1>Errores y excepciones<\/h1>\n<p>Hasta ahora los mensajes de error no hab\u00edan sido m\u00e1s que mencionados, pero si probaste los ejemplos probablemente hayas visto algunos. Hay (al menos) dos tipos diferentes de errores:\u00a0<em>errores de sintaxis<\/em>\u00a0y\u00a0<em>excepciones<\/em>.<\/p>\n<div id=\"errores-de-sintaxis\" class=\"section\">\n<h2>Errores de sintaxis<\/h2>\n<p>Los errores de sintaxis, tambi\u00e9n conocidos como errores de interpretaci\u00f3n, son quiz\u00e1s el tipo de queja m\u00e1s com\u00fan que ten\u00e9s cuando todav\u00eda est\u00e1s aprendiendo Python:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">while<\/span> <span class=\"kc\">True<\/span> <span class=\"nb\">print<\/span> <span class=\"s1\">'Hola Mundo'<\/span>\r\n<span class=\"gt\">Traceback (most recent call last):<\/span>\r\n<span class=\"c\">...<\/span>\r\n    <span class=\"k\">while<\/span> <span class=\"kc\">True<\/span> <span class=\"nb\">print<\/span> <span class=\"s1\">'Hola Mundo'<\/span>\r\n                   <span class=\"o\">^<\/span>\r\n<span class=\"gr\">SyntaxError<\/span>: <span class=\"n\">invalid syntax<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>El int\u00e9rprete repite la l\u00ednea culpable y muestra una peque\u00f1a \u201cflecha\u201d que apunta al primer lugar donde se detect\u00f3 el error. Este es causado por (o al menos detectado en) el s\u00edmbolo que\u00a0<em>precede<\/em>\u00a0a la flecha: en el ejemplo, el error se detecta en la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">print<\/span><\/code>, ya que faltan dos puntos (<code class=\"docutils literal notranslate\"><span class=\"pre\">':'<\/span><\/code>) antes del mismo. Se muestran el nombre del archivo y el n\u00famero de l\u00ednea para que sepas d\u00f3nde mirar en caso de que la entrada venga de un programa.<\/p>\n<\/div>\n<div id=\"excepciones\" class=\"section\">\n<h2>Excepciones<\/h2>\n<p>Incluso si la sentencia o expresi\u00f3n es sint\u00e1cticamente correcta, puede generar un error cuando se intenta ejecutarla. Los errores detectados durante la ejecuci\u00f3n se llaman\u00a0<em>excepciones<\/em>, y no son incondicionalmente fatales: pronto aprender\u00e1s c\u00f3mo manejarlos en los programas en Python. Sin embargo, la mayor\u00eda de las excepciones no son manejadas por los programas, y resultan en mensajes de error como los mostrados aqu\u00ed:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"mi\">10<\/span> <span class=\"o\">*<\/span> <span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"o\">\/<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\r\n<span class=\"gt\">Traceback (most recent call last):<\/span>\r\n  File <span class=\"nb\">\"&lt;stdin&gt;\"<\/span>, line <span class=\"m\">1<\/span>, in <span class=\"n\">?<\/span>\r\n<span class=\"gr\">ZeroDivisionError<\/span>: <span class=\"n\">integer division or modulo by zero<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"mi\">4<\/span> <span class=\"o\">+<\/span> <span class=\"n\">spam<\/span><span class=\"o\">*<\/span><span class=\"mi\">3<\/span>\r\n<span class=\"gt\">Traceback (most recent call last):<\/span>\r\n  File <span class=\"nb\">\"&lt;stdin&gt;\"<\/span>, line <span class=\"m\">1<\/span>, in <span class=\"n\">?<\/span>\r\n<span class=\"gr\">NameError<\/span>: <span class=\"n\">name 'spam' is not defined<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"s1\">'2'<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">2<\/span>\r\n<span class=\"gt\">Traceback (most recent call last):<\/span>\r\n  File <span class=\"nb\">\"&lt;stdin&gt;\"<\/span>, line <span class=\"m\">1<\/span>, in <span class=\"n\">?<\/span>\r\n<span class=\"gr\">TypeError<\/span>: <span class=\"n\">cannot concatenate 'str' and 'int' objects<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>La \u00faltima l\u00ednea de los mensajes de error indica qu\u00e9 sucedi\u00f3. Las excepciones vienen de distintos tipos, y el tipo se imprime como parte del mensaje: los tipos en el ejemplo son:\u00a0<span class=\"std std-ref\">ZeroDivisionError<\/span>,\u00a0<span class=\"std std-ref\">NameError<\/span>\u00a0y\u00a0<span class=\"std std-ref\">TypeError<\/span>.<\/p>\n<p>La cadena mostrada como tipo de la excepci\u00f3n es el nombre de la excepci\u00f3n predefinida que ocurri\u00f3. Esto es verdad para todas las excepciones predefinidas del int\u00e9rprete, pero no necesita ser verdad para excepciones definidas por el usuario (aunque es una convenci\u00f3n \u00fatil). Los nombres de las excepciones est\u00e1ndar son identificadores incorporados al int\u00e9rprete (no son palabras clave reservadas).<\/p>\n<p>El resto de la l\u00ednea provee un detalle basado en el tipo de la excepci\u00f3n y qu\u00e9 la caus\u00f3.<\/p>\n<p>La parte anterior del mensaje de error muestra el contexto donde la excepci\u00f3n sucedi\u00f3, en la forma de un\u00a0<em>trazado del error<\/em>\u00a0listando l\u00edneas fuente; sin embargo, no mostrar\u00e1 l\u00edneas le\u00eddas desde la entrada est\u00e1ndar.<\/p>\n<p><span class=\"std std-ref\">Excepciones integradas<\/span>, es una lista las excepciones predefinidas y sus significados.<\/p>\n<\/div>\n<div id=\"manejando-excepciones\" class=\"section\"><span id=\"python-sent-try-except\"><\/span><\/p>\n<h2>Manejando excepciones<\/h2>\n<p>Es posible escribir programas que manejen determinadas excepciones. Mir\u00e1 el siguiente ejemplo, que le pide al usuario una entrada hasta que ingrese un entero v\u00e1lido, pero permite al usuario interrumpir el programa (usando\u00a0<kbd class=\"kbd docutils literal notranslate\">Control-C<\/kbd>\u00a0o lo que sea que el sistema operativo soporte); not\u00e1 que una interrupci\u00f3n generada por el usuario se se\u00f1aliza generando la excepci\u00f3n\u00a0<span class=\"std std-ref\">KeyboardInterrupt<\/span>.<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">while<\/span> <span class=\"kc\">True<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>        <span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">raw_input<\/span><span class=\"p\">(<\/span><span class=\"sa\">u<\/span><span class=\"s2\">\"Por favor ingrese un n\u00famero: \"<\/span><span class=\"p\">))<\/span>\r\n<span class=\"gp\">... <\/span>        <span class=\"k\">break<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">except<\/span> <span class=\"ne\">ValueError<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>        <span class=\"nb\">print<\/span> <span class=\"sa\">u<\/span><span class=\"s2\">\"Oops!  No era v\u00e1lido. Intente nuevamente...\"<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>La sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>\u00a0funciona de la siguiente manera:<\/p>\n<ul class=\"simple\">\n<li>Primero, se ejecuta el\u00a0<em>bloque try<\/em>\u00a0(el c\u00f3digo entre las sentencias\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>\u00a0y\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">except<\/span><\/code>).<\/li>\n<li>Si no ocurre ninguna excepci\u00f3n, el\u00a0<em>bloque except<\/em>\u00a0se saltea y termina la ejecuci\u00f3n de la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>.<\/li>\n<li>Si ocurre una excepci\u00f3n durante la ejecuci\u00f3n del\u00a0<em>bloque try<\/em>, el resto del bloque se saltea. Luego, si su tipo coincide con la excepci\u00f3n nombrada luego de la palabra reservada\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">except<\/span><\/code>, se ejecuta el\u00a0<em>bloque except<\/em>, y la ejecuci\u00f3n contin\u00faa luego de la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>.<\/li>\n<li>Si ocurre una excepci\u00f3n que no coincide con la excepci\u00f3n nombrada en el\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">except<\/span><\/code>, esta se pasa a declaraciones\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>\u00a0de m\u00e1s afuera; si no se encuentra nada que la maneje, es una\u00a0<em>excepci\u00f3n no manejada<\/em>, y la ejecuci\u00f3n se frena con un mensaje como los mostrados arriba.<\/li>\n<\/ul>\n<p>Una sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>\u00a0puede tener m\u00e1s de un\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">except<\/span><\/code>, para especificar manejadores para distintas excepciones. A lo sumo un manejador ser\u00e1 ejecutado. S\u00f3lo se manejan excepciones que ocurren en el correspondiente\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>, no en otros manejadores del mismo\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>. Un\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">except<\/span><\/code>\u00a0puede nombrar m\u00faltiples excepciones usando par\u00e9ntesis, por ejemplo:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"o\">...<\/span> <span class=\"k\">except<\/span> <span class=\"p\">(<\/span><span class=\"ne\">RuntimeError<\/span><span class=\"p\">,<\/span> <span class=\"ne\">TypeError<\/span><span class=\"p\">,<\/span> <span class=\"ne\">NameError<\/span><span class=\"p\">):<\/span>\r\n<span class=\"o\">...<\/span>     <span class=\"k\">pass<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>El \u00faltimo\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">except<\/span><\/code>\u00a0puede omitir nombrar qu\u00e9 excepci\u00f3n captura, para servir como comod\u00edn. Us\u00e1 esto con extremo cuidado, ya que de esta manera es f\u00e1cil ocultar un error real de programaci\u00f3n. Tambi\u00e9n puede usarse para mostrar un mensaje de error y luego re-generar la excepci\u00f3n (permiti\u00e9ndole al que llama, manejar tambi\u00e9n la excepci\u00f3n):<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"kn\">import<\/span> <span class=\"nn\">sys<\/span>\r\n\r\n<span class=\"k\">try<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"n\">f<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">open<\/span><span class=\"p\">(<\/span><span class=\"s1\">'numeros.txt'<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">s<\/span> <span class=\"o\">=<\/span> <span class=\"n\">f<\/span><span class=\"o\">.<\/span><span class=\"n\">readline<\/span><span class=\"p\">()<\/span>\r\n    <span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">int<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span><span class=\"o\">.<\/span><span class=\"n\">strip<\/span><span class=\"p\">())<\/span>\r\n<span class=\"k\">except<\/span> <span class=\"ne\">IOError<\/span> <span class=\"k\">as<\/span> <span class=\"p\">(<\/span><span class=\"n\">errno<\/span><span class=\"p\">,<\/span> <span class=\"n\">strerror<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"nb\">print<\/span> <span class=\"s2\">\"Error E\/S (<\/span><span class=\"si\">{0}<\/span><span class=\"s2\">): <\/span><span class=\"si\">{1}<\/span><span class=\"s2\">\"<\/span><span class=\"o\">.<\/span><span class=\"n\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">errno<\/span><span class=\"p\">,<\/span> <span class=\"n\">strerror<\/span><span class=\"p\">)<\/span>\r\n<span class=\"k\">except<\/span> <span class=\"ne\">ValueError<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"nb\">print<\/span> <span class=\"s2\">\"No pude convertir el dato a un entero.\"<\/span>\r\n<span class=\"k\">except<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"nb\">print<\/span> <span class=\"s2\">\"Error inesperado:\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">sys<\/span><span class=\"o\">.<\/span><span class=\"n\">exc_info<\/span><span class=\"p\">()[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"k\">raise<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>Las declaraciones\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>\u00a0\u2026\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">except<\/span><\/code>\u00a0tienen un\u00a0<em>bloque else<\/em>\u00a0opcional, el cual, cuando est\u00e1 presente, debe seguir a los\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">except<\/span><\/code>. Es \u00fatil para aquel c\u00f3digo que debe ejecutarse si el\u00a0<em>bloque try<\/em>\u00a0no genera una excepci\u00f3n. Por ejemplo:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"k\">for<\/span> <span class=\"n\">arg<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">sys<\/span><span class=\"o\">.<\/span><span class=\"n\">argv<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">:]:<\/span>\r\n    <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\r\n        <span class=\"n\">f<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">open<\/span><span class=\"p\">(<\/span><span class=\"n\">arg<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'r'<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"k\">except<\/span> <span class=\"ne\">IOError<\/span><span class=\"p\">:<\/span>\r\n        <span class=\"nb\">print<\/span> <span class=\"s1\">'no pude abrir'<\/span><span class=\"p\">,<\/span> <span class=\"n\">arg<\/span>\r\n    <span class=\"k\">else<\/span><span class=\"p\">:<\/span>\r\n        <span class=\"nb\">print<\/span> <span class=\"n\">arg<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'tiene'<\/span><span class=\"p\">,<\/span> <span class=\"nb\">len<\/span><span class=\"p\">(<\/span><span class=\"n\">f<\/span><span class=\"o\">.<\/span><span class=\"n\">readlines<\/span><span class=\"p\">()),<\/span> <span class=\"s1\">'lineas'<\/span>\r\n        <span class=\"n\">f<\/span><span class=\"o\">.<\/span><span class=\"n\">close<\/span><span class=\"p\">()<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>El uso de\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">else<\/span><\/code>\u00a0es mejor que agregar c\u00f3digo adicional en el\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>\u00a0porque evita capturar accidentalmente una excepci\u00f3n que no fue generada por el c\u00f3digo que est\u00e1 protegido por la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>\u00a0\u2026\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">except<\/span><\/code>.<\/p>\n<p>Cuando ocurre una excepci\u00f3n, puede tener un valor asociado, tambi\u00e9n conocido como el\u00a0<em>argumento<\/em>\u00a0de la excepci\u00f3n. La presencia y el tipo de argumento depende del tipo de excepci\u00f3n.<\/p>\n<p>El\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">except<\/span><\/code>\u00a0puede especificar una variable luego del nombre (o tupla) de excepci\u00f3n(es). La variable se vincula a una instancia de excepci\u00f3n con los argumentos almacenados en\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">instance.args<\/span><\/code>. Por conveniencia, la instancia de excepci\u00f3n define\u00a0<code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__str__()<\/span><\/code>\u00a0para que se pueda mostrar los argumentos directamente, sin necesidad de hacer referencia a\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">.args<\/span><\/code>.<\/p>\n<p>Uno tambi\u00e9n puede instanciar una excepci\u00f3n antes de generarla, y agregarle cualquier atributo que se desee:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">try<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>   <span class=\"k\">raise<\/span> <span class=\"ne\">Exception<\/span><span class=\"p\">(<\/span><span class=\"s1\">'carne'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'huevos'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"gp\">... <\/span><span class=\"k\">except<\/span> <span class=\"ne\">Exception<\/span> <span class=\"k\">as<\/span> <span class=\"n\">inst<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>   <span class=\"nb\">print<\/span> <span class=\"nb\">type<\/span><span class=\"p\">(<\/span><span class=\"n\">inst<\/span><span class=\"p\">)<\/span>     <span class=\"c1\"># la instancia de excepci\u00f3n<\/span>\r\n<span class=\"gp\">... <\/span>   <span class=\"nb\">print<\/span> <span class=\"n\">inst<\/span><span class=\"o\">.<\/span><span class=\"n\">args<\/span>      <span class=\"c1\"># argumentos guardados en .args<\/span>\r\n<span class=\"gp\">... <\/span>   <span class=\"nb\">print<\/span> <span class=\"n\">inst<\/span>           <span class=\"c1\"># __str__ permite imprimir args directamente<\/span>\r\n<span class=\"gp\">... <\/span>   <span class=\"n\">x<\/span><span class=\"p\">,<\/span> <span class=\"n\">y<\/span> <span class=\"o\">=<\/span> <span class=\"n\">inst<\/span>          <span class=\"c1\"># __getitem__ permite usar args directamente<\/span>\r\n<span class=\"gp\">... <\/span>   <span class=\"nb\">print<\/span> <span class=\"s1\">'x ='<\/span><span class=\"p\">,<\/span> <span class=\"n\">x<\/span>\r\n<span class=\"gp\">... <\/span>   <span class=\"nb\">print<\/span> <span class=\"s1\">'y ='<\/span><span class=\"p\">,<\/span> <span class=\"n\">y<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"go\">&lt;type 'exceptions.Exception'&gt;<\/span>\r\n<span class=\"go\">('carne', 'huevos')<\/span>\r\n<span class=\"go\">('carne', 'huevos')<\/span>\r\n<span class=\"go\">x = carne<\/span>\r\n<span class=\"go\">y = huevos<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>Si una excepci\u00f3n tiene un argumento, este se imprime como la \u00faltima parte (el \u201cdetalle\u201d) del mensaje para las excepciones que no est\u00e1n manejadas.<\/p>\n<p>Los manejadores de excepciones no manejan solamente las excepciones que ocurren en el\u00a0<em>bloque try<\/em>, tambi\u00e9n manejan las excepciones que ocurren dentro de las funciones que se llaman (inclusive indirectamente) dentro del\u00a0<em>bloque try<\/em>. Por ejemplo:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">def<\/span> <span class=\"nf\">esto_falla<\/span><span class=\"p\">():<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span><span class=\"o\">\/<\/span><span class=\"mi\">0<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">try<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"n\">esto_falla<\/span><span class=\"p\">()<\/span>\r\n<span class=\"gp\">... <\/span><span class=\"k\">except<\/span> <span class=\"ne\">ZeroDivisionError<\/span> <span class=\"k\">as<\/span> <span class=\"n\">detail<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"nb\">print<\/span> <span class=\"s1\">'Manejando error en tiempo de ejecuci\u00f3n:'<\/span><span class=\"p\">,<\/span> <span class=\"n\">detail<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"go\">Manejando error en tiempo de ejecuci\u00f3n: integer division or modulo by zero<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"levantando-excepciones\" class=\"section\"><span id=\"python-sent-raise\"><\/span><\/p>\n<h2>Levantando excepciones<\/h2>\n<p>La sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">raise<\/span><\/code>\u00a0permite al programador forzar a que ocurra una excepci\u00f3n espec\u00edfica. Por ejemplo:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">raise<\/span> <span class=\"ne\">NameError<\/span><span class=\"p\">(<\/span><span class=\"s1\">'Hola'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"gt\">Traceback (most recent call last):<\/span>\r\n  File <span class=\"nb\">\"&lt;stdin&gt;\"<\/span>, line <span class=\"m\">1<\/span>, in <span class=\"n\">?<\/span>\r\n<span class=\"gr\">NameError<\/span>: <span class=\"n\">Hola<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>El \u00fanico argumento a\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">raise<\/span><\/code>\u00a0indica la excepci\u00f3n a generarse. Tiene que ser o una instancia de excepci\u00f3n, o una clase de excepci\u00f3n (una clase que hereda de\u00a0<span class=\"std std-ref\">Exception<\/span>).<\/p>\n<p>Si necesit\u00e1s determinar cuando una excepci\u00f3n fue lanzada pero no quer\u00e9s manejarla, una forma simplificada de la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">raise<\/span><\/code>\u00a0te permite relanzarla:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">try<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">raise<\/span> <span class=\"ne\">NameError<\/span><span class=\"p\">(<\/span><span class=\"s1\">'Hola'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"gp\">... <\/span><span class=\"k\">except<\/span> <span class=\"ne\">NameError<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"nb\">print<\/span> <span class=\"sa\">u<\/span><span class=\"s1\">'Ha sucedido una excepci\u00f3n!'<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">raise<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"go\">Ha sucedido una excepci\u00f3n!<\/span>\r\n<span class=\"gt\">Traceback (most recent call last):<\/span>\r\n  File <span class=\"nb\">\"&lt;stdin&gt;\"<\/span>, line <span class=\"m\">2<\/span>, in <span class=\"n\">?<\/span>\r\n<span class=\"gr\">NameError<\/span>: <span class=\"n\">Hola<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"sentencia-assert\" class=\"section\"><span id=\"python-sent-assert\"><\/span><\/p>\n<h2>Sentencia assert<\/h2>\n<p>La sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">assert<\/span><\/code>\u00a0es una v\u00eda conveniente para insertar afirmaciones de depuraci\u00f3n dentro de un programa:<\/p>\n<p>La forma simple, \u00abassert expression\u00bb, es equivalente a:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"k\">if<\/span> <span class=\"n\">__debug__<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">expression<\/span><span class=\"p\">:<\/span> <span class=\"k\">raise<\/span> <span class=\"ne\">AssertionError<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>La forma extendida, \u00abassert expression1, expression2\u00bb, es equivalente a:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"k\">if<\/span> <span class=\"n\">__debug__<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">expression1<\/span><span class=\"p\">:<\/span> <span class=\"k\">raise<\/span> <span class=\"ne\">AssertionError<\/span><span class=\"p\">(<\/span><span class=\"n\">expression2<\/span><span class=\"p\">)<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>Estas equivalencias suponen que\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">__debug__<\/span><\/code>\u00a0y la excepci\u00f3n \u00ab<a class=\"reference internal\" href=\"https:\/\/entrenamiento-python-basico.readthedocs.io\/es\/2.7\/leccion9\/exceptions.html#python-exception-assertionerror\"><span class=\"std std-ref\">AssertionError<\/span><\/a>\u00bb se refieren a las variables incorporadas con esos nombres. En la corriente implementaci\u00f3n, la variable incorporada\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">__debug__<\/span><\/code>\u00a0es\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">True<\/span><\/code>\u00a0en circunstancias normales,\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">False<\/span><\/code>\u00a0cuando se solicita la optimizaci\u00f3n (opci\u00f3n del l\u00ednea de comando\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">-O<\/span><\/code>). El generador de c\u00f3digo actual no emite ning\u00fan c\u00f3digo para una sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">assert<\/span><\/code>\u00a0cuando se solicita la optimizaci\u00f3n en tiempo de compilaci\u00f3n. Nota que no es necesario incluir el c\u00f3digo fuente de la expresi\u00f3n que fall\u00f3 en el mensaje de error; se mostrar\u00e1 como parte del\u00a0<em>stack trace<\/em>.<\/p>\n<p>Asignaciones a\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">__debug__<\/span><\/code>\u00a0son ilegales. El valor para la variable integrada es determinada cuando el interprete inicia.<\/p>\n<\/div>\n<div id=\"excepciones-definidas-por-el-usuario\" class=\"section\"><span id=\"python-excepciones-usuario\"><\/span><\/p>\n<h2>Excepciones definidas por el usuario<\/h2>\n<p>Los programas pueden nombrar sus propias excepciones creando una nueva clase excepci\u00f3n (mir\u00e1 el apartado de\u00a0<span class=\"std std-ref\">Clases<\/span>\u00a0para m\u00e1s informaci\u00f3n sobre las clases de Python). Las excepciones, t\u00edpicamente, deber\u00e1n derivar de la clase\u00a0<span class=\"std std-ref\">Exception<\/span>, directa o indirectamente. Por ejemplo:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">class<\/span> <span class=\"nc\">MiError<\/span><span class=\"p\">(<\/span><span class=\"ne\">Exception<\/span><span class=\"p\">):<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">def<\/span> <span class=\"fm\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">valor<\/span><span class=\"p\">):<\/span>\r\n<span class=\"gp\">... <\/span>        <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">valor<\/span> <span class=\"o\">=<\/span> <span class=\"n\">valor<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">def<\/span> <span class=\"fm\">__str__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\r\n<span class=\"gp\">... <\/span>        <span class=\"k\">return<\/span> <span class=\"nb\">repr<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">valor<\/span><span class=\"p\">)<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">try<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">raise<\/span> <span class=\"n\">MiError<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"o\">*<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\r\n<span class=\"gp\">... <\/span><span class=\"k\">except<\/span> <span class=\"n\">MiError<\/span> <span class=\"k\">as<\/span> <span class=\"n\">e<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"nb\">print<\/span> <span class=\"sa\">u<\/span><span class=\"s1\">'Ha ocurrido mi excepci\u00f3n, valor:'<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"o\">.<\/span><span class=\"n\">valor<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"go\">Ocurri\u00f3 mi excepci\u00f3n, valor: 4<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">raise<\/span> <span class=\"n\">MiError<\/span><span class=\"p\">(<\/span><span class=\"s1\">'oops!'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"gt\">Traceback (most recent call last):<\/span>\r\n  File <span class=\"nb\">\"&lt;stdin&gt;\"<\/span>, line <span class=\"m\">1<\/span>, in <span class=\"n\">?<\/span>\r\n<span class=\"gr\">__main__.MiError<\/span>: <span class=\"n\">'oops!'<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>En este ejemplo, el m\u00e9todo\u00a0<code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__init__()<\/span><\/code>\u00a0de\u00a0<span class=\"std std-ref\">Exce<\/span><span class=\"std std-ref\">p<\/span><span class=\"std std-ref\">tion<\/span>\u00a0fue sobrescrito. El nuevo comportamiento simplemente crea el atributo\u00a0<em>valor<\/em>.<\/p>\n<p>Esto reemplaza el comportamiento por defecto de crear el atributo\u00a0<em>args<\/em>.<\/p>\n<p>Las clases de Excepciones pueden ser definidas de la misma forma que cualquier otra clase, pero usualmente se mantienen simples, a menudo solo ofreciendo un n\u00famero de atributos con informaci\u00f3n sobre el error que leer\u00e1n los manejadores de la excepci\u00f3n. Al crear un m\u00f3dulo que puede lanzar varios errores distintos, una pr\u00e1ctica com\u00fan es crear una clase base para excepciones definidas en ese m\u00f3dulo y extenderla para crear clases excepciones espec\u00edficas para distintas condiciones de error:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"k\">class<\/span> <span class=\"nc\">Error<\/span><span class=\"p\">(<\/span><span class=\"ne\">Exception<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"sd\">\"\"\"Clase base para excepciones en el m\u00f3dulo.\"\"\"<\/span>\r\n    <span class=\"k\">pass<\/span>\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">EntradaError<\/span><span class=\"p\">(<\/span><span class=\"n\">Error<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"sd\">\"\"\"Exception lanzada por errores en las entradas.<\/span>\r\n\r\n<span class=\"sd\">    Atributos:<\/span>\r\n<span class=\"sd\">        expresion -- expresi\u00f3n de entrada en la que ocurre el error<\/span>\r\n<span class=\"sd\">        mensaje -- explicaci\u00f3n del error<\/span>\r\n<span class=\"sd\">    \"\"\"<\/span>\r\n\r\n    <span class=\"k\">def<\/span> <span class=\"fm\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">expresion<\/span><span class=\"p\">,<\/span> <span class=\"n\">mensaje<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">expresion<\/span> <span class=\"o\">=<\/span> <span class=\"n\">expresion<\/span>\r\n        <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">mensaje<\/span> <span class=\"o\">=<\/span> <span class=\"n\">mensaje<\/span>\r\n\r\n<span class=\"k\">class<\/span> <span class=\"nc\">TransicionError<\/span><span class=\"p\">(<\/span><span class=\"n\">Error<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"sd\">\"\"\"Lanzada cuando una operaci\u00f3n intenta una<\/span>\r\n<span class=\"sd\">       transici\u00f3n de estado no permitida.<\/span>\r\n\r\n<span class=\"sd\">    Atributos:<\/span>\r\n<span class=\"sd\">        previo -- estado al principio de la transici\u00f3n<\/span>\r\n<span class=\"sd\">        siguiente -- nuevo estado intentado<\/span>\r\n<span class=\"sd\">        mensaje -- explicaci\u00f3n de porque la transici\u00f3n no esta permitida<\/span>\r\n<span class=\"sd\">    \"\"\"<\/span>\r\n    <span class=\"k\">def<\/span> <span class=\"fm\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">previo<\/span><span class=\"p\">,<\/span> <span class=\"n\">siguiente<\/span><span class=\"p\">,<\/span> <span class=\"n\">mensaje<\/span><span class=\"p\">):<\/span>\r\n        <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">previo<\/span> <span class=\"o\">=<\/span> <span class=\"n\">previo<\/span>\r\n        <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">siguiente<\/span> <span class=\"o\">=<\/span> <span class=\"n\">siguiente<\/span>\r\n        <span class=\"bp\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">mensaje<\/span> <span class=\"o\">=<\/span> <span class=\"n\">mensaje<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>La mayor\u00eda de las excepciones son definidas con nombres que terminan en \u00abError\u00bb, similares a los nombres de las excepciones est\u00e1ndar.<\/p>\n<p>Muchos m\u00f3dulos est\u00e1ndar definen sus propias excepciones para reportar errores que pueden ocurrir en funciones propias. Se puede encontrar m\u00e1s informaci\u00f3n sobre clases en el cap\u00edtulo\u00a0<span class=\"std std-ref\">Clases<\/span>.<\/p>\n<\/div>\n<div id=\"definiendo-acciones-de-limpieza\" class=\"section\"><span id=\"python-sent-finally\"><\/span><\/p>\n<h2>Definiendo acciones de limpieza<\/h2>\n<p>La sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>\u00a0tiene otra sentencia opcional que intenta definir acciones de limpieza que deben ser ejecutadas bajo ciertas circunstancias. Por ejemplo:<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">try<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">raise<\/span> <span class=\"ne\">KeyboardInterrupt<\/span>\r\n<span class=\"gp\">... <\/span><span class=\"k\">finally<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"nb\">print<\/span> <span class=\"s1\">'Adi\u00f3s, Mundo!'<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"go\">Chau, Mundo!<\/span>\r\n<span class=\"nc\">KeyboardInterrupt<\/span>\r\n<span class=\"gt\">Traceback (most recent call last):<\/span>\r\n  File <span class=\"nb\">\"&lt;stdin&gt;\"<\/span>, line <span class=\"m\">2<\/span>, in <span class=\"n\">?<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>Una\u00a0<em>sentencia finally<\/em>\u00a0siempre es ejecutada antes de salir de la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>, ya sea que una excepci\u00f3n haya ocurrido o no. Cuando ocurre una excepci\u00f3n en la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>\u00a0y no fue manejada por una sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">except<\/span><\/code>\u00a0(o ocurri\u00f3 en una sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">except<\/span><\/code>\u00a0o\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">else<\/span><\/code>), es relanzada luego de que se ejecuta la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">finally<\/span><\/code>. La sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">finally<\/span><\/code>\u00a0es tambi\u00e9n ejecutada \u00aba la salida\u00bb cuando cualquier otra sentencia de la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>\u00a0es dejada v\u00eda\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">break<\/span><\/code>,\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">continue<\/span><\/code>\u00a0or\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">return<\/span><\/code>. Un ejemplo m\u00e1s complicado (sentencias\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">except<\/span><\/code>\u00a0y\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">finally<\/span><\/code>\u00a0en la misma sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">try<\/span><\/code>):<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"k\">def<\/span> <span class=\"nf\">dividir<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">,<\/span> <span class=\"n\">y<\/span><span class=\"p\">):<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>        <span class=\"n\">resultado<\/span> <span class=\"o\">=<\/span> <span class=\"n\">x<\/span> <span class=\"o\">\/<\/span> <span class=\"n\">y<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">except<\/span> <span class=\"ne\">ZeroDivisionError<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>        <span class=\"nb\">print<\/span> <span class=\"s2\">\"\u00a1divisi\u00f3n por cero!\"<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">else<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>        <span class=\"nb\">print<\/span> <span class=\"s2\">\"el resultado es\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">resultado<\/span>\r\n<span class=\"gp\">... <\/span>    <span class=\"k\">finally<\/span><span class=\"p\">:<\/span>\r\n<span class=\"gp\">... <\/span>        <span class=\"nb\">print<\/span> <span class=\"s2\">\"ejecutando la clausula finally\"<\/span>\r\n<span class=\"gp\">...<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">dividir<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">el resultado es 2<\/span>\r\n<span class=\"go\">ejecutando la clausula finally<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">dividir<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">\u00a1divisi\u00f3n por cero!<\/span>\r\n<span class=\"go\">ejecutando la clausula finally<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">divide<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"2\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"1\"<\/span><span class=\"p\">)<\/span>\r\n<span class=\"go\">ejecutando la clausula finally<\/span>\r\n<span class=\"gt\">Traceback (most recent call last):<\/span>\r\n  File <span class=\"nb\">\"&lt;stdin&gt;\"<\/span>, line <span class=\"m\">1<\/span>, in <span class=\"n\">?<\/span>\r\n  File <span class=\"nb\">\"&lt;stdin&gt;\"<\/span>, line <span class=\"m\">3<\/span>, in <span class=\"n\">divide<\/span>\r\n<span class=\"gr\">TypeError<\/span>: <span class=\"n\">unsupported operand type(s) for \/: 'str' and 'str'<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>Como puedes ver, la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">finally<\/span><\/code>\u00a0es ejecutada siempre. La excepci\u00f3n\u00a0<span class=\"std std-ref\">TypeError<\/span>\u00a0lanzada al dividir dos cadenas de caracteres no es manejado por la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">except<\/span><\/code>\u00a0y por lo tanto es relanzada luego de que se ejecuta la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">finally<\/span><\/code>.<\/p>\n<p>En aplicaciones reales, la sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">finally<\/span><\/code>\u00a0es \u00fatil para liberar recursos externos (como archivos o conexiones de red), sin importar si el uso del recurso fue exitoso.<\/p>\n<\/div>\n<div id=\"acciones-predefinidas-de-limpieza\" class=\"section\">\n<h2>Acciones predefinidas de limpieza<\/h2>\n<p>Algunos objetos definen acciones de limpieza est\u00e1ndar que llevar a cabo cuando el objeto no es m\u00e1s necesitado, independientemente de que las operaciones sobre el objeto hayan sido exitosas o no. Mir\u00e1 el siguiente ejemplo, que intenta\u00a0<span class=\"std std-ref\">abrir un archivo<\/span>\u00a0e imprimir su contenido en la pantalla.<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"k\">for<\/span> <span class=\"n\">linea<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">open<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"numeros.txt\"<\/span><span class=\"p\">):<\/span>\r\n    <span class=\"nb\">print<\/span> <span class=\"n\">linea<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>El problema con este c\u00f3digo es que deja el archivo abierto por un periodo de tiempo indeterminado luego de que termine de ejecutarse. Esto no es un problema en scripts simples, pero puede ser un problema en aplicaciones m\u00e1s grandes.<\/p>\n<div id=\"sentencia-with\" class=\"section\"><span id=\"python-sent-with\"><\/span><\/p>\n<h3>Sentencia with<\/h3>\n<p>La sentencia\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">with<\/span><\/code>\u00a0permite que objetos como archivos sean usados de una forma que asegure que siempre se los libera r\u00e1pido y en forma correcta.<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"k\">with<\/span> <span class=\"nb\">open<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"numeros.txt\"<\/span><span class=\"p\">)<\/span> <span class=\"k\">as<\/span> <span class=\"n\">f<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"k\">for<\/span> <span class=\"n\">linea<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">f<\/span><span class=\"p\">:<\/span>\r\n        <span class=\"nb\">print<\/span> <span class=\"n\">linea<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n<p>Luego de que la sentencia sea ejecutada, el archivo\u00a0<em>f<\/em>\u00a0siempre es cerrado, incluso si se encuentra un problema al procesar las l\u00edneas. Otros objetos que provean acciones de limpieza predefinidas lo indicar\u00e1n en su documentaci\u00f3n.<\/p>\n<\/div>\n<\/div>\n<div id=\"traceback\" class=\"section\">\n<h2>Traceback<\/h2>\n<p>El\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">Traceback<\/span><\/code>\u00a0o\u00a0<em>trazado inverso<\/em>, es un listado de las funciones en curso de ejecuci\u00f3n, presentadas cuando sucede un error en tiempo de ejecuci\u00f3n. Es com\u00fan que al trazado inverso tambi\u00e9n se le conozca como\u00a0<em>trazado de pila<\/em>, porque lista las funciones en el orden en el cual son almacenadas en la\u00a0pila de llamadas.<\/p>\n<p>El m\u00f3dulo integrado\u00a0traceback\u00a0incorpora el comportamiento de\u00a0<code class=\"docutils literal notranslate\"><span class=\"pre\">Traceback<\/span><\/code>\u00a0o\u00a0<em>trazado inverso<\/em>\u00a0ya que extrae, formatea e imprime informaci\u00f3n acerca de\u00a0<em>trazado del stack<\/em>\u00a0de los errores y excepciones en Python.<\/p>\n<div class=\"highlight-default notranslate\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"kn\">import<\/span> <span class=\"nn\">traceback<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">traceback<\/span><span class=\"o\">.<\/span><span class=\"vm\">__doc__<\/span>\r\n<span class=\"go\">'Extract, format and print information about Python stack traces.'<\/span>\r\n<span class=\"gp\">&gt;&gt;&gt; <\/span><span class=\"n\">help<\/span><span class=\"p\">(<\/span><span class=\"n\">traceback<\/span><span class=\"p\">)<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Errores y excepciones Hasta ahora los mensajes de error no hab\u00edan sido m\u00e1s que mencionados, pero si probaste los ejemplos probablemente hayas visto algunos. Hay (al menos) dos tipos diferentes de errores:\u00a0errores de sintaxis\u00a0y\u00a0excepciones. Errores de sintaxis Los errores de sintaxis, tambi\u00e9n conocidos como errores de interpretaci\u00f3n, son quiz\u00e1s el tipo de queja m\u00e1s com\u00fan [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":331,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[39,40],"tags":[],"class_list":["post-391","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacion","category-python"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/equipomedios.com\/blog\/wp-content\/uploads\/2024\/08\/python-logo-master-v3-TM.png?fit=601%2C203&ssl=1","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/posts\/391","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/comments?post=391"}],"version-history":[{"count":1,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/posts\/391\/revisions"}],"predecessor-version":[{"id":392,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/posts\/391\/revisions\/392"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/media\/331"}],"wp:attachment":[{"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/media?parent=391"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/categories?post=391"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/equipomedios.com\/blog\/wp-json\/wp\/v2\/tags?post=391"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}