¿Cómo obtener el nombre de una excepción que se detectó en Python?

3 minutos de lectura

avatar de usuario
Rob Bednark

¿Cómo puedo obtener el nombre de una excepción que se generó en Python?

p.ej,

try:
    foo = bar
except Exception as exception:
    name_of_exception = ???
    assert name_of_exception == 'NameError'
    print "Failed with exception [%s]" % name_of_exception

Por ejemplo, estoy detectando varias (o todas) excepciones y quiero imprimir el nombre de la excepción en un mensaje de error.

  • Por qué ¿Crees que necesitas esto? ¿Por qué no capturar una excepción más concreta (por ejemplo, except NameError:) ¿para empezar?

    usuario395760

    11 de agosto de 2013 a las 21:07

  • Tengo un par de escenarios en los que quiero capturar todas las excepciones (o una lista de ellas) y quiero imprimir el nombre de la excepción en un mensaje de error.

    –Rob Bednark

    12 de agosto de 2013 a las 7:04

  • Es posible que desee consultar la biblioteca estándar traceback módulo, que tiene funciones que hacen un buen formato de excepciones y rastreos.

    – Caballero negro

    22 mayo 2014 a las 23:16


  • @delnan, esta situación surge cuando está probando si una función genera una excepción según lo programado

    – gokul_uf

    14/03/2016 a las 15:32

  • Necesitaba algo como esto para SECAR algo de código: el método al que llamo puede generar varias excepciones, cada una se maneja con su propia except declaración, pero la entrada de registro es muy similar en cada caso.

    – Adamc

    12 oct 2017 a las 16:01

avatar de usuario
usuario1234

Aquí hay algunas formas diferentes de obtener el nombre de la clase de la excepción:

  1. type(exception).__name__
  2. exception.__class__.__name__
  3. exception.__class__.__qualname__

p.ej,

try:
    foo = bar
except Exception as exception:
    assert type(exception).__name__ == 'NameError'
    assert exception.__class__.__name__ == 'NameError'
    assert exception.__class__.__qualname__ == 'NameError'

  • cuando levantas raise socket.timeout solo obtienes el nombre: timeout

    –Ricky Levi

    22 de septiembre de 2020 a las 8:21

  • ¿Hay alguna manera de obtener el traceback(most recent call last) : ... ?

    usuario13786942

    2 oct 2020 a las 18:45


si quieres el nombre de clase completamente calificado (p.ej sqlalchemy.exc.IntegrityError en lugar de solo IntegrityError), puede usar la función a continuación, que tomé de la increíble respuesta de MB a otra pregunta (solo cambié el nombre de algunas variables para adaptarlas a mis gustos):

def get_full_class_name(obj):
    module = obj.__class__.__module__
    if module is None or module == str.__class__.__module__:
        return obj.__class__.__name__
    return module + '.' + obj.__class__.__name__

Ejemplo:

try:
    # <do something with sqlalchemy that angers the database>
except sqlalchemy.exc.SQLAlchemyError as e:
    print(get_full_class_name(e))

# sqlalchemy.exc.IntegrityError

avatar de usuario
mosh fiqur

También puedes usar sys.exc_info(). exc_info() devuelve 3 valores: tipo, valor, rastreo. Sobre la documentación: https://docs.python.org/3/library/sys.html#sys.exc_info

import sys

try:
    foo = bar
except Exception:
    exc_type, value, traceback = sys.exc_info()
    assert exc_type.__name__ == 'NameError'
    print "Failed with exception [%s]" % exc_type.__name__

Puede imprimir la excepción usando algunas cadenas formateadas:

Ejemplo:

try:
    #Code to execute
except Exception as err:
    print(f"{type(err).__name__} was raised: {err}")

Esto funciona, pero parece que debe haber una manera más fácil y directa.

try:
    foo = bar
except Exception as exception:
    assert repr(exception) == '''NameError("name 'bar' is not defined",)'''
    name = repr(exception).split('(')[0]
    assert name == 'NameError'

  • Reemplazar except Exception as exception con el tipo de excepción que le gustaría capturar, es decir except NameError as exception.

    – Maciej Gol

    11 de agosto de 2013 a las 21:05

  • No quiero atrapar excepciones particulares conocidas de antemano. quiero atrapar todos excepciones

    –Rob Bednark

    27 de abril de 2018 a las 16:10

avatar de usuario
SeñorNombre

Las otras respuestas aquí son excelentes para fines de exploración, pero si el objetivo principal es registrar la excepción (incluido el nombre de la excepción), tal vez considere usar registro.excepción en lugar de imprimir?

  • Reemplazar except Exception as exception con el tipo de excepción que le gustaría capturar, es decir except NameError as exception.

    – Maciej Gol

    11 de agosto de 2013 a las 21:05

  • No quiero atrapar excepciones particulares conocidas de antemano. quiero atrapar todos excepciones

    –Rob Bednark

    27 de abril de 2018 a las 16:10

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad