{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
""
]
},
{
"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
}