Python'da yakalanan istisnanın adı nasıl alınır?


122

Python'da ortaya çıkan bir istisnanın adını nasıl alabilirim?

Örneğin,

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

Örneğin, birden çok (veya tümünü) istisnayı yakalıyorum ve istisnanın adını bir hata mesajında ​​yazdırmak istiyorum.


3
Neden buna ihtiyacın olduğunu düşünüyorsun? except NameError:Başlamak için neden daha somut bir istisna (örneğin ) yakalamayasınız ?

7
Tüm istisnaları (veya bunların bir listesini) yakalamak istediğim ve istisnanın adını bir hata mesajında ​​yazdırmak istediğim birkaç senaryom var.
Rob Bednark

1
tracebackİstisnaları ve izleme engellerini güzel biçimlendiren işlevlere sahip standart kitaplık modülüne göz atmak isteyebilirsiniz.
Blckknght

1
@delnan bu durum, bir işlevin programlandığı gibi bir istisna oluşturup oluşturmadığını test ettiğinizde ortaya çıkar
gokul_uf

Bazı kodları KURUTMAK için buna benzer bir şeye ihtiyacım vardı: Aradığım yöntemle birkaç istisna ortaya çıkabilir, her biri kendi exceptifadeleriyle işlenir , ancak günlük girişi her durumda çok benzer.
Adam Carroll

Yanıtlar:


224

İstisna sınıfının adını almanın birkaç farklı yolu:

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

Örneğin,

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

6

Bu işe yarıyor, ancak daha kolay, daha doğrudan bir yol olmalı gibi görünüyor?

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

4
except Exception as exceptionYakalamak istediğiniz istisna türü ile değiştirin , yani except NameError as exception.
Maciej Gol

8
Önceden bilinen belirli istisnaları yakalamak istemiyorum. Tüm istisnaları yakalamak istiyorum .
Rob Bednark

3

Ayrıca kullanabilirsiniz sys.exc_info(). exc_info()3 değer döndürür: tür, değer, geri izleme. Belgelerde: 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__

1

Tam nitelikli sınıf adını istiyorsanız (örneğin sqlalchemy.exc.IntegrityErrorsadece yerine IntegrityError), MB'nin harika cevabından başka bir soruya aldığım aşağıdaki işlevi kullanabilirsiniz (sadece zevklerime uyacak şekilde bazı değişkenleri yeniden adlandırdım):

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__

Misal:

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

# sqlalchemy.exc.IntegrityError

0

Buradaki diğer yanıtlar keşif amaçları için harikadır, ancak birincil hedef istisnayı günlüğe kaydetmekse (istisnanın adı dahil), belki print yerine logging.exception kullanmayı düşünün ?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.