Saltar al contenido principal

Tipos de excepciones

En Python, y en la mayoría de lenguajes que utilizan excepciones, hay diferentes tipos de excepciones. El tipo se imprime como parte del mensaje de error. Algunos de los más comunes son:

  • ZeroDivisionError: se produce cuando se intenta realizar una división entre 0.
  • TypeError: ocurre cuando una operación o función se aplica a un valor de tipo no válido. Por ejemplo, cuando queremos concatenar cadenas de texto con números.
  • ValueError: se genera cuando una operación o función recibe un argumento que tiene el tipo correcto pero un valor no apropiado.

El tipo es el nombre de la excepción que ocurrió. Esto es válido para todas las excepciones predefinidas por el intérprete así como para aquellas que son definidas por los usuarios. Los nombres de las excepciones también actúan como palabras reservadas del lenguaje.

Junto con el nombre de la excepción, generalmente se aporta más información sobre la causa de esta excepción.

En la documentación oficial podemos encontrar las excepciones predefinidas y por qué se producen:

BaseException
├── BaseExceptionGroup
├── GeneratorExit
├── KeyboardInterrupt
├── SystemExit
└── Exception
├── ArithmeticError
│ ├── FloatingPointError
│ ├── OverflowError
│ └── ZeroDivisionError
├── AssertionError
├── AttributeError
├── BufferError
├── EOFError
├── ExceptionGroup [BaseExceptionGroup]
├── ImportError
│ └── ModuleNotFoundError
├── LookupError
│ ├── IndexError
│ └── KeyError
├── MemoryError
├── NameError
│ └── UnboundLocalError
├── OSError
│ ├── BlockingIOError
│ ├── ChildProcessError
│ ├── ConnectionError
│ │ ├── BrokenPipeError
│ │ ├── ConnectionAbortedError
│ │ ├── ConnectionRefusedError
│ │ └── ConnectionResetError
│ ├── FileExistsError
│ ├── FileNotFoundError
│ ├── InterruptedError
│ ├── IsADirectoryError
│ ├── NotADirectoryError
│ ├── PermissionError
│ ├── ProcessLookupError
│ └── TimeoutError
├── ReferenceError
├── RuntimeError
│ ├── NotImplementedError
│ ├── PythonFinalizationError
│ └── RecursionError
├── StopAsyncIteration
├── StopIteration
├── SyntaxError
│ └── IndentationError
│ └── TabError
├── SystemError
├── TypeError
├── ValueError
│ └── UnicodeError
│ ├── UnicodeDecodeError
│ ├── UnicodeEncodeError
│ └── UnicodeTranslateError
└── Warning
├── BytesWarning
├── DeprecationWarning
├── EncodingWarning
├── FutureWarning
├── ImportWarning
├── PendingDeprecationWarning
├── ResourceWarning
├── RuntimeWarning
├── SyntaxWarning
├── UnicodeWarning
└── UserWarning

Captura específica de una determinada excepción

En el punto anterior vimos cómo capturar cualquier excepción. En este caso, procederemos a capturar un tipo de excepción concreto.

Para ello, tras la cláusula except añadimos el tipo de excepción que queremos capturar:

try:
x = int(input("Introduce un número: "))
except ValueError:
print("El valor introducido no se corresponde con un valor numérico")

En este caso, solo se capturarán errores dentro del bloque try de tipo ValueError.

Una declaración try puede tener más de una cláusula except, para especificar diferentes gestiones para diferentes excepciones:

try:
x = int(input("Introduce un número: "))
z = 10 / x
except ValueError:
print("El valor introducido no se corresponde con un valor numérico")
except ZeroDivisionError:
print("Se produjo una división entre 0")

Como máximo, solo se ejecutará un bloque except. Cuando uno de estos se ejecuta, directamente se salta todo el bloque try con sus correspondientes except.

Además, una cláusula except también puede gestionar varias excepciones añadiéndolas entre paréntesis y separadas por comas tras la directiva except:

try:
x = int(input("Introduce un número: "))
z = 10 / x
except (ValueError, ZeroDivisionError):
print("El valor introducido no se corresponde con un valor numérico o se produjo una división entre 0")