{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "EsvgyXLFc99i" }, "source": [ "# Control de errores\n", "Conviene prevenir errores con los que se pueda enfrentar el usuario." ] }, { "cell_type": "markdown", "metadata": { "id": "pcc7y3czc99k" }, "source": [ "## Ultimo pop\n", "Al hacer pop en una lista se elimina el último elemento. \n", "En una lista vacía dará error." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "c7XhXJysc99m" }, "outputs": [], "source": [ "l=[1,2,3]\n", "\n", "l.pop()\n", "l.pop()\n", "l.pop() # aquí ya estamos en una lista vacía\n", "#l.pop() # aquí dará error" ] }, { "cell_type": "markdown", "metadata": { "id": "yMuGKdTZc99o" }, "source": [ "Podemos prevenir el error con un if." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "PJIg1JICc99p" }, "outputs": [], "source": [ "l=[1,2,3]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "tu-jzPx-c99q" }, "outputs": [], "source": [ "if len(l)>1: # podemos ejecutar este código más de 3 veces y no producirá error\n", " l.pop()" ] }, { "cell_type": "markdown", "metadata": { "id": "tZpp1TJAc99r" }, "source": [ "## División entre cero\n", "Al dividir un número entre cero obtenemos un error." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "FKoy5OSRc99r" }, "outputs": [], "source": [ "def divide(a,b):\n", " if b == 0:\n", " return None # su b es cero se retorna None que evita el error\n", " return a/b\n", "\n", "a = 15\n", "b = 0\n", "divide(a,b)" ] }, { "cell_type": "markdown", "metadata": { "id": "3QZpgCA2c99s" }, "source": [ "## Introduciendo un texto y no un número\n", "Si el usuario introduce un texto en lugar de un número para evitar que se produzca un error debemos realizar un manejo de excepciones con ```try``` y ```except```.\n", "El siguiente código es igual que el anterior, pero una de las variables contiene un string, por lo que dará error." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "rL8dlxKzc99u", "outputId": "2f8b5c08-0fb0-485a-a8bd-105db7d682b8" }, "outputs": [ { "ename": "TypeError", "evalue": "unsupported operand type(s) for /: 'int' and 'str'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m15\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[0mb\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m'asdf'\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 7\u001b[1;33m \u001b[0mdivide\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mb\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32m\u001b[0m in \u001b[0;36mdivide\u001b[1;34m(a, b)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mdivide\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mb\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mb\u001b[0m\u001b[1;33m==\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[1;32mNone\u001b[0m \u001b[1;31m# su b es cero se retorna None que evita el error\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0mb\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m15\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mTypeError\u001b[0m: unsupported operand type(s) for /: 'int' and 'str'" ] } ], "source": [ "def divide(a,b):\n", " if b == 0:\n", " return None # su b es cero se retorna None que evita el error\n", " return a/b\n", "\n", "a = 15\n", "b = 'asdf'\n", "divide(a,b)" ] }, { "cell_type": "markdown", "metadata": { "id": "s0EeKQdjc99v" }, "source": [ "## Control de errores con ```try``` y ```except```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "hQXN076mc99w" }, "outputs": [], "source": [ "try:\n", " x = float(input(\"Introduzca un número: \")) # introduciendo un texto se produce un error\n", " y = 10\n", " print(f'{x} / {y} = {x/y}')\n", "except:\n", " print(\"Se produjo un error. Introduzca un número válido.\") # imprimimos una frase cuando se produce una excepción" ] }, { "cell_type": "markdown", "metadata": { "id": "Hn9XDFaTc99x" }, "source": [ "### Con un ```while```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ykmnj2iLc99y" }, "outputs": [], "source": [ "while True:\n", " try:\n", " x = float(input(\"Introduzca un número: \"))\n", " y = 10\n", " print(f'{x} / {y} = {x/y}')\n", " break # aquí se rompe el bucle si todo ha ido bien\n", " except:\n", " print(\"Se produjo un error. Introduzca un número válido.\")" ] }, { "cell_type": "markdown", "metadata": { "id": "y_cNpl5Bc99z" }, "source": [ "## Añadiendo ```else```\n", "Este será el lugar adecuado para incluir el ```break```." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "zlN5H2Y1c99z" }, "outputs": [], "source": [ "while True:\n", " try:\n", " x = float(input(\"Introduzca un número: \"))\n", " y = 10\n", " print(f'{x} / {y} = {x/y}')\n", " except:\n", " print(\"Se produjo un error. Introduzca un número válido.\")\n", " else:\n", " print(\"Cálculo correctamente realizado.\")\n", " break # aquí se rompe el bucle si todo ha ido bien" ] }, { "cell_type": "markdown", "metadata": { "id": "NaqqGK14c990" }, "source": [ "## Añadiendo ```finally```" ] }, { "cell_type": "markdown", "metadata": { "id": "cQi8ChOrc991" }, "source": [ "### Ejemplo 1: sin función" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "sQWlmL_wc991", "outputId": "a9a993d7-a126-48c5-9b6d-0864f5208064" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Introduzca un número: 456\n", "456.0 / 10 = 45.6\n", "Cálculo correctamente realizado.\n", "Fin del bucle\n" ] } ], "source": [ "while True:\n", " try:\n", " x = float(input(\"Introduzca un número: \"))\n", " y = 10\n", " print(f'{x} / {y} = {x/y}')\n", " except:\n", " print(\"Se produjo un error. Introduzca un número válido.\")\n", " else:\n", " print(\"Cálculo correctamente realizado.\")\n", " break # aquí se rompe el bucle si todo ha ido bien\n", " finally:\n", " print(\"Fin del bucle\") # siempre se ejecutará" ] }, { "cell_type": "markdown", "metadata": { "id": "C9i9jISyc992" }, "source": [ "### Ejemplo 2: con función\n", "Siempre que se invoque la función se ejecutará el código que hay en ```finally```, se produzca o no la excepción. Ese código está asociado a la función." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "0I-hCyOfc993", "outputId": "ccbd1766-b0f9-4ea3-a15c-b14659fa76bf" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Función en marcha.\n", "Este código siempre se ejecuta.\n", "0.5\n" ] } ], "source": [ "def test(n):\n", " try:\n", " print(\"Función en marcha.\")\n", " return 10/n\n", " except:\n", " return \"Ha ocurrido un error, finalizando el código.\"\n", " finally:\n", " print(\"Este código siempre se ejecuta.\")\n", "\n", "n = test(20)\n", "print(n)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "y93i5vSsc993", "outputId": "55b318ab-6714-45c4-8815-459df016108b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Función en marcha.\n", "Este código siempre se ejecuta.\n", "Ha ocurrido un error, finalizando el código.\n" ] } ], "source": [ "n = test(0) # si el argumento es 0 se produce una división por cero y salta la excepción\n", "print(n) # el código que hay en finally siempre se ejecuta, salte o no la excepción" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" }, "colab": { "name": "0730_control_de_errores.ipynb", "provenance": [], "include_colab_link": true } }, "nbformat": 4, "nbformat_minor": 0 }