Làm thế nào để lấy tên của ngoại lệ đã bị bắt trong Python?


122

Làm cách nào tôi có thể lấy tên của một ngoại lệ đã được nêu ra trong Python?

ví dụ,

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

Ví dụ: tôi đang bắt nhiều (hoặc tất cả) ngoại lệ và muốn in tên của ngoại lệ trong một thông báo lỗi.


3
Tại sao bạn nghĩ bạn cần cái này? Tại sao không bắt đầu một ngoại lệ cụ thể hơn (ví dụ except NameError:)?

7
Tôi có một vài trường hợp mà tôi muốn nắm bắt tất cả các ngoại lệ (hoặc danh sách chúng) và muốn in ra tên của ngoại lệ trong một thông báo lỗi.
Rob Bednark

1
Bạn có thể muốn kiểm tra tracebackmô-đun của thư viện tiêu chuẩn, mô-đun này có các chức năng thực hiện một số định dạng đẹp về các ngoại lệ và theo dõi.
Blckknght

1
@delnan tình trạng này xảy ra khi bạn đang thử nghiệm nếu một chức năng được nâng cao một ngoại lệ như được lập trình
gokul_uf

Tôi cần một cái gì đó như thế này để KHÔ một số mã: một số ngoại lệ có thể được nêu ra bằng phương thức tôi đang gọi, mỗi ngoại lệ được xử lý bằng exceptcâu lệnh riêng của chúng , nhưng mục nhập nhật ký rất giống nhau trong mỗi trường hợp.
Adam Carroll

Câu trả lời:


223

Dưới đây là một số cách khác nhau để lấy tên của lớp ngoại lệ:

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

ví dụ,

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

6

Điều này hiệu quả, nhưng có vẻ như phải có một cách dễ dàng hơn, trực tiếp hơn?

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
Thay thế except Exception as exceptionbằng loại ngoại lệ bạn muốn nắm bắt, tức là except NameError as exception.
Maciej Gol

8
Tôi không muốn biết trước các trường hợp ngoại lệ cụ thể. Tôi muốn nắm bắt tất cả các trường hợp ngoại lệ.
Rob Bednark

3

Bạn cũng có thể sử dụng sys.exc_info(). exc_info()trả về 3 giá trị: type, value, traceback. Trên tài liệu: 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

Nếu bạn muốn tên lớp đủ điều kiện (ví dụ: sqlalchemy.exc.IntegrityErrorthay vì chỉ IntegrityError), bạn có thể sử dụng hàm bên dưới, mà tôi đã lấy từ câu trả lời tuyệt vời của MB cho một câu hỏi khác (tôi chỉ đổi tên một số biến để phù hợp với sở thích của mình):

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__

Thí dụ:

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

Các câu trả lời khác ở đây là tuyệt vời cho mục đích thăm dò, nhưng nếu mục tiêu chính là ghi lại ngoại lệ (bao gồm cả tên của ngoại lệ), có lẽ nên xem xét sử dụng logging.exception thay vì in?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.