{"id":46504,"date":"2025-05-07T06:29:22","date_gmt":"2025-05-07T06:29:22","guid":{"rendered":"https:\/\/www.carmatec.com\/?p=46504"},"modified":"2025-12-31T07:39:38","modified_gmt":"2025-12-31T07:39:38","slug":"como-imprimir-y-depurar-excepciones-en-python-como-un-profesional","status":"publish","type":"post","link":"https:\/\/www.carmatec.com\/es\/blog\/how-to-print-and-debug-exceptions-in-python-like-a-pro\/","title":{"rendered":"C\u00f3mo imprimir y depurar excepciones en Python como un profesional"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"46504\" class=\"elementor elementor-46504\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cf469a3 e-flex e-con-boxed e-con e-parent\" data-id=\"cf469a3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6c8ef79 elementor-widget elementor-widget-text-editor\" data-id=\"6c8ef79\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Python es famoso por su simplicidad y legibilidad, pero incluso el c\u00f3digo m\u00e1s elegante puede encontrar errores. Cuando las cosas van mal, las excepciones son la forma que tiene Python de indicar que ha ocurrido algo inesperado. Saber c\u00f3mo imprimir y manejar estas excepciones es una habilidad cr\u00edtica para cualquier desarrollador, tanto si est\u00e1s construyendo un simple script como una aplicaci\u00f3n compleja. En esta gu\u00eda en profundidad, exploraremos el arte de imprimir excepciones en Python, sumergi\u00e9ndonos en t\u00e9cnicas pr\u00e1cticas, mejores pr\u00e1cticas y ejemplos del mundo real para ayudarte a depurar eficazmente y escribir c\u00f3digo robusto.<\/p><p>Este art\u00edculo cubrir\u00e1 los fundamentos de las excepciones, varios m\u00e9todos para imprimirlas, t\u00e9cnicas avanzadas de depuraci\u00f3n y un ejemplo pr\u00e1ctico de codificaci\u00f3n. Al final, estar\u00e1s equipado para manejar errores con confianza y precisi\u00f3n.<\/p><h3><strong>\u00bfQu\u00e9 son las excepciones en Python?<\/strong><\/h3><p>Antes de sumergirnos en la impresi\u00f3n de excepciones, aclaremos qu\u00e9 es una excepci\u00f3n. En Python, una excepci\u00f3n es un evento que interrumpe el flujo normal de la ejecuci\u00f3n de un programa. Es la forma que tiene Python de decir: \"\u00a1Eh, aqu\u00ed pasa algo!\". Las excepciones pueden ocurrir por varias razones, tales como:<\/p><ul><li><strong>FileNotFoundError:<\/strong> Intento de abrir un archivo inexistente.<\/li><li><strong>ZeroDivisionError:<\/strong> Dividir un n\u00famero por cero.<\/li><li><strong>TypeError:<\/strong> Realizaci\u00f3n de una operaci\u00f3n sobre tipos de datos incompatibles.<\/li><li><strong>KeyError:<\/strong> Acceso a una clave de diccionario inexistente.<\/li><\/ul><p>Cuando ocurre una excepci\u00f3n, Python la lanza, y si no se maneja, el programa se bloquea con un rastreo-un informe detallado del error. Imprimir excepciones te permite capturar y analizar estos errores, facilitando la depuraci\u00f3n.<\/p><h3><strong>\u00bfPor qu\u00e9 imprimir excepciones?<\/strong><\/h3><p>Imprimir excepciones tiene varias finalidades:<\/p><ul><li><strong>Depuraci\u00f3n:<\/strong> Ayuda a identificar la causa y la localizaci\u00f3n de un error.<\/li><li><strong>Registro:<\/strong> Registra los errores para su posterior an\u00e1lisis, algo crucial para las aplicaciones de producci\u00f3n.<\/li><li><strong>Comentarios de los usuarios:<\/strong> Proporciona mensajes de error significativos a los usuarios.<\/li><li><strong>Mejora del c\u00f3digo:<\/strong> Comprender las excepciones ayuda a escribir c\u00f3digo m\u00e1s robusto.<\/li><\/ul><p>Ahora, vamos a explorar las distintas formas de imprimir excepciones en Python.<\/p><h5><strong>M\u00e9todo 1: Utilizar un bloque Try-Except b\u00e1sico<\/strong><\/h5><p>La forma m\u00e1s sencilla de imprimir una excepci\u00f3n es utilizando una directiva <code>try-except<\/code> bloque. Esta estructura permite capturar excepciones e imprimir sus detalles.<\/p><pre>python\nprobar:\n    result = 10 \/ 0\nexcept ErrorDivisi\u00f3nCero as e:\n    print(f \"Se ha producido un error: {e}\")<\/pre><p><strong>Salida:<br \/><\/strong>Se ha producido un error: divisi\u00f3n por cero<\/p><p>En este ejemplo:<\/p><ul><li>El <code>pruebe<\/code> contiene c\u00f3digo que puede provocar una excepci\u00f3n.<\/li><li>El <code>excepto<\/code> captura el bloque <code>Error de divisi\u00f3n por cero<\/code> y lo almacena en la variable <code>e<\/code>.<\/li><li>El <code>imprimir<\/code> muestra el mensaje de excepci\u00f3n.<\/li><\/ul><p>El as <code>e<\/code> asigna el objeto de excepci\u00f3n a <code>e<\/code>que contiene el mensaje de error. Puede sustituir <code>Error de divisi\u00f3n por cero<\/code> con otros tipos de excepci\u00f3n o utilizar un <code>Excepci\u00f3n<\/code> para capturar todas las excepciones (aunque esto no siempre es recomendable).<\/p><h5><strong>M\u00e9todo 2: Imprimir el rastreo completo<\/strong><\/h5><p>A veces, necesitas algo m\u00e1s que el mensaje de error: necesitas el rastreo completo para ver d\u00f3nde se ha producido el error. La funci\u00f3n <code>rastreo<\/code> es perfecto para ello.<\/p><pre>python\nimportar traceback\n\nprobar:\n    resultado = 10 \/ 0\nexcept ErrorDivisi\u00f3nCero:\n    traceback.print_exc()<\/pre><p><strong>Salida:<\/strong><br \/>Traceback (\u00faltima llamada m\u00e1s reciente):<br \/>File \"script.py\", line 4, in .<br \/>resultado = 10 \/ 0<br \/>ZeroDivisionError: divisi\u00f3n por cero<\/p><p>El <code>traceback.print_exc()<\/code> imprime el seguimiento completo de la pila, mostrando el archivo, el n\u00famero de l\u00ednea y la pila de llamadas que conducen al error. Esto es muy \u00fatil para depurar aplicaciones complejas.<\/p><h3><strong>M\u00e9todo 3: Capturar el tipo de excepci\u00f3n y los detalles<\/strong><\/h3><p>Para obtener un mayor control, puede capturar el tipo de excepci\u00f3n, el mensaje y el rastreo utilizando <code>sys.exc_info()<\/code> del <code>sys<\/code> m\u00f3dulo.<\/p><pre>python\nimportar sistema\n\nprobar:\n    result = 10 \/ 0\nexcept:\n    exc_type, exc_value, exc_traceback = sys.exc_info()\n    print(f \"Tipo de excepci\u00f3n: {exc_type}\")\n    print(f \"Mensaje de excepci\u00f3n: {exc_value}\")\n    print(f \"Traceback: {exc_traceback}\")<\/pre><p>Salida:<br \/>Tipo de Excepci\u00f3n:<br \/>Mensaje de excepci\u00f3n: divisi\u00f3n por cero<br \/>Traceback:<\/p><p>Este m\u00e9todo proporciona informaci\u00f3n detallada sobre la excepci\u00f3n, que es \u00fatil para el registro o la gesti\u00f3n personalizada de errores. Tenga en cuenta que <code>sys.exc_info()<\/code> devuelve una tupla que contiene el tipo de excepci\u00f3n, el valor y el objeto traceback.<\/p><h5><strong>M\u00e9todo 4: Utilizar <code>try-except<\/code> con <code>si no<\/code> y <code>finalmente<\/code><\/strong><\/h5><p>Python <code>try-except<\/code> admite cl\u00e1usulas adicionales: <code>si no<\/code> y <code>finalmente<\/code>. Estos pueden mejorar su gesti\u00f3n de excepciones.<\/p><pre>python\nprueba:\n    number = int(input(\"Introduzca un n\u00famero: \"))\nexcept ErrorValor as e:\n    print(f \"Entrada no v\u00e1lida: {e}\")\nelse:\n    print(f \"Ha introducido: {n\u00famero}\")\nfinally:\n    print(\"Ejecuci\u00f3n completada.\")<\/pre><p><strong>Ejemplo de salida (entrada no v\u00e1lida):<\/strong><br \/>Introduzca un n\u00famero: abc<br \/>Entrada inv\u00e1lida: literal inv\u00e1lido para int() con base 10: 'abc'<br \/>Ejecuci\u00f3n completada.<\/p><p><strong>Ejemplo de salida (entrada v\u00e1lida):<\/strong><br \/>Introduzca un n\u00famero: 42<br \/>Has entrado: 42<br \/>Ejecuci\u00f3n completada.<\/p><ul><li>El <code>si no<\/code> se ejecuta si no se produce ninguna excepci\u00f3n, lo que permite separar la l\u00f3gica de \u00e9xito de la gesti\u00f3n de errores.<\/li><li>El <code>finalmente<\/code> se ejecuta independientemente de si se ha producido una excepci\u00f3n, ideal para tareas de limpieza como cerrar archivos o liberar recursos.<\/li><\/ul><h5><strong>M\u00e9todo 5: Registro de excepciones para producci\u00f3n<\/strong><\/h5><p>En las aplicaciones de producci\u00f3n, no basta con imprimir las excepciones en la consola, es necesario registrarlas para su posterior an\u00e1lisis. La funci\u00f3n <code>registro<\/code> es perfecto para ello.<\/p><pre>python\nimportar registro\n\nlogging.basicConfig(filename='app.log', level=logging.ERROR)\n\nprueba:\n    result = 10 \/ 0\nexcept ZeroDivisionError as e:\n    logging.error(\"Se ha producido un error\", exc_info=True)<\/pre><p>Este c\u00f3digo registra la excepci\u00f3n, incluido el rastreo completo, en un archivo llamado <code>app.log<\/code>. En <code>exc_info=Verdadero<\/code> garantiza que se incluya el rastreo. Tambi\u00e9n puedes configurar el registro para que env\u00ede los errores a un servidor o los env\u00ede por correo electr\u00f3nico a los desarrolladores.<\/p><h3><strong>Buenas pr\u00e1cticas para imprimir excepciones<\/strong><\/h3><p>Para imprimir excepciones con eficacia, siga estas pr\u00e1cticas recomendadas:<\/p><ul><li><strong>Sea espec\u00edfico con las excepciones:<\/strong> Capturar excepciones espec\u00edficas (por ejemplo, <code>Error de divisi\u00f3n por cero<\/code>) en lugar del gen\u00e9rico <code>Excepci\u00f3n<\/code> para evitar enmascarar errores inesperados.<\/li><li><strong>Incluir el contexto:<\/strong> Proporcione mensajes significativos para ayudar a diagnosticar el problema (por ejemplo, \"Error al dividir 10 entre 0\").<\/li><li><strong>Utilizar el registro en producci\u00f3n:<\/strong> Evite <code>imprimir<\/code> en el c\u00f3digo de producci\u00f3n; utilice las sentencias <code>registro<\/code> en su lugar.<\/li><li><strong>Evite las excepciones desnudas:<\/strong> Utilizando <code>excepto:<\/code> sin especificar un tipo de excepci\u00f3n puede capturar se\u00f1ales del sistema como <code>Interrupci\u00f3n del teclado<\/code>lo que provoca problemas dif\u00edciles de depurar.<\/li><li><strong>Recursos de limpieza:<\/strong> Utilice <code>finalmente<\/code> o gestores de contexto (<code>con<\/code> ) para garantizar que recursos como archivos o conexiones a bases de datos se cierran correctamente.<\/li><\/ul><h3><strong>Ejemplo de programaci\u00f3n real: Un script de procesamiento de archivos<\/strong><\/h3><p>Let\u2019s put everything together with a practical example\u2014exactly the kind of exercise you\u2019d complete in a <a href=\"https:\/\/www.mygreatlearning.com\/academy\/premium\/master-python-programming\">python programming course<\/a>. Below is a script that processes a file, handles exceptions, and logs errors. This example demonstrates multiple exception-handling techniques.<\/p><pre>python\nimportar logging\nimportar traceback\nimport sys\n\n# Configurar logging\nlogging.basicConfig(\n    filename='archivo_procesador.log',\n    level=logging.ERROR,\n    format='%(asctime)s - %(levelname)s - %(message)s'\n)\n\ndef procesar_archivo(nombrearchivo):\n    \"\"\"\n    Procesa un fichero y calcula la suma de los n\u00fameros que contiene.\n    Cada l\u00ednea debe contener un n\u00famero.\n    \"\"\"\n    total = 0\n    n\u00famero_de_l\u00ednea = 0\n\n    prueba:\n        with open(nombre_archivo, 'r') as archivo:\n            para l\u00ednea en archivo:\n                n\u00famero_l\u00ednea += 1\n                try:\n                    n\u00famero = float(l\u00ednea.strip())\n                    total += n\u00famero\n                except ErrorValor as e:\n                    print(f \"N\u00famero no v\u00e1lido en la l\u00ednea {n\u00famero_de_l\u00ednea}: {l\u00ednea.strip()}\")\n                    logging.error(f \"Error de valor en la l\u00ednea {n\u00famero_de_l\u00ednea}: {e}\")\n                    continuar\n        si no:\n            print(f \"Fichero procesado con \u00e9xito. Total: {total}\")\n    except FileNotFoundError as e:\n        print(f \"Error: Archivo '{nombre_archivo}' no encontrado.\")\n        logging.error(f \"ErrorFicheroNoEncontrado: {e}\", exc_info=True)\n    except PermissionError as e:\n        print(f \"Error: Permiso denegado para el archivo '{nombredearchivo}'.\")\n        logging.error(f \"PermissionError: {e}\", exc_info=True)\n    except Exception as e:\n        print(f \"Se ha producido un error inesperado: {e}\")\n        exc_type, exc_value, exc_traceback = sys.exc_info()\n        logging.error(\n            f \"Error inesperado: {exc_tipo} - {exc_valor}\",\n            exc_info=True\n        )\n    Finalmente:\n        print(\"Intento de procesamiento de fichero completado.\")\n\n# Prueba la funci\u00f3n\nif __name__ == \"__main__\":\n    archivo_prueba = \"n\u00fameros.txt\"\n    print(f \"Intento de procesar fichero: {fichero_prueba}\")\n    procesar_archivo(archivo_prueba)<\/pre><h3><strong>C\u00f3mo funciona:<\/strong><\/h3><ul><li><strong>Configuraci\u00f3n del registro:<\/strong> El script configura el <code>registro<\/code> para escribir errores en <code>archivo_procesador.log<\/code> con marcas de tiempo.<\/li><li><strong>Try-Except anidado:<\/strong> El exterior <code>pruebe<\/code> gestiona los errores relacionados con los archivos (<code>FileNotFoundError, PermissionError<\/code>), mientras que el interior <code>pruebe<\/code> gestiona los n\u00fameros no v\u00e1lidos (<code>ErrorValor<\/code>).<\/li><li><strong>Gestor de contexto:<\/strong> El <code>con<\/code> garantiza que el archivo se cierre correctamente, incluso si se produce un error.<\/li><li><strong>Cl\u00e1usula Else:<\/strong> Si el fichero se procesa sin errores, se imprime el total.<\/li><li><strong>Cl\u00e1usula final:<\/strong> Se imprime un mensaje para indicar que el proceso ha finalizado.<\/li><li><strong>Registro exhaustivo:<\/strong> Todas las excepciones se registran con trazas para su depuraci\u00f3n.<\/li><\/ul><p><strong>Ejemplo de archivo de entrada (<code>n\u00fameros.txt<\/code>):<\/strong><br \/>10<br \/>20<br \/>abc<br \/>30<\/p><p><strong>Muestra de salida:<\/strong><br \/>Intentando procesar archivo: numbers.txt<br \/>N\u00famero no v\u00e1lido en la l\u00ednea 3: abc<br \/>Fichero procesado con \u00e9xito. Total: 60.0<br \/>Intento de procesamiento de archivos completado.<\/p><p><strong>Ejemplo de archivo de registro (<code>archivo_procesador.log<\/code>):<\/strong><br \/>2026-05-07 10:00:00,123 &#8211; ERROR &#8211; ValueError at line 3: could not convert string to float: &#8216;abc&#8217;<br \/>Si el fichero no existe, la salida puede ser:<br \/>Intentando procesar archivo: numbers.txt<br \/>Error: Archivo 'numbers.txt' no encontrado.<br \/>Intento de procesamiento de archivos completado.<\/p><h3><strong>Consejos avanzados de depuraci\u00f3n<\/strong><\/h3><p>Para llevar su gesti\u00f3n de excepciones al siguiente nivel:<\/p><ul><li><strong>Utilizar depuradores:<\/strong> Herramientas como <code>pdb<\/code> o IDEs (por ejemplo, PyCharm, VS Code) permiten recorrer el c\u00f3digo e inspeccionar variables cuando se produce una excepci\u00f3n.<\/li><li><strong>Excepciones personalizadas:<\/strong> Defina sus propias clases de excepci\u00f3n para condiciones de error espec\u00edficas en grandes proyectos.<\/li><li><strong>Sentry o herramientas similares:<\/strong> Utilice servicios de seguimiento de errores para controlar las excepciones en las aplicaciones de producci\u00f3n.<\/li><li><strong>Pruebas unitarias:<\/strong> Escriba pruebas para simular excepciones y verificar su l\u00f3gica de gesti\u00f3n de errores.<\/li><\/ul><h2><strong>Conclusi\u00f3n<\/strong><\/h2><p>Imprimir excepciones en Python es m\u00e1s que un truco de depuraci\u00f3n: es la piedra angular para escribir c\u00f3digo robusto y f\u00e1cil de mantener. Dominando <code>try-except<\/code> bloques, aprovechando la <code>rastreo<\/code> y <code>registro<\/code> y siguiendo las mejores pr\u00e1cticas, podr\u00e1 gestionar los errores con elegancia y obtener informaci\u00f3n detallada sobre el comportamiento de su programa. El ejemplo real que se ofrece demuestra c\u00f3mo combinar estas t\u00e9cnicas en una aplicaci\u00f3n pr\u00e1ctica, haciendo que su c\u00f3digo sea resistente y est\u00e9 listo para la producci\u00f3n.<\/p><p>Tanto si eres un principiante aprendiendo a utilizar Python como si eres un desarrollador experimentado creando sistemas complejos, entender c\u00f3mo imprimir y manejar excepciones te convertir\u00e1 en un mejor programador de Python. <a href=\"https:\/\/www.carmatec.com\/es\/\">Carmatec<\/a> permite a las empresas disponer de <a href=\"https:\/\/www.carmatec.com\/es\/empresa-de-desarrollo-python\/\">Servicios de desarrollo en Python<\/a> a medida para acelerar <a href=\"https:\/\/www.carmatec.com\/es\/servicios-de-transformacion-digital\/\">transformaci\u00f3n digital.<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Python is renowned for its simplicity and readability, but even the most elegant code can encounter errors. When things go awry, exceptions are Python\u2019s way of signaling that something unexpected has happened. Knowing how to print and handle these exceptions is a critical skill for any developer, whether you\u2019re building a simple script or a [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":46521,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,76],"tags":[],"class_list":["post-46504","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","category-python"],"_links":{"self":[{"href":"https:\/\/www.carmatec.com\/es\/wp-json\/wp\/v2\/posts\/46504","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.carmatec.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.carmatec.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.carmatec.com\/es\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.carmatec.com\/es\/wp-json\/wp\/v2\/comments?post=46504"}],"version-history":[{"count":0,"href":"https:\/\/www.carmatec.com\/es\/wp-json\/wp\/v2\/posts\/46504\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.carmatec.com\/es\/wp-json\/wp\/v2\/media\/46521"}],"wp:attachment":[{"href":"https:\/\/www.carmatec.com\/es\/wp-json\/wp\/v2\/media?parent=46504"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.carmatec.com\/es\/wp-json\/wp\/v2\/categories?post=46504"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.carmatec.com\/es\/wp-json\/wp\/v2\/tags?post=46504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}