Lấy tên của lớp mà đối tượng ngoại lệ thuộc về:
e.__class__.__name__
và sử dụng hàm print_exc () cũng sẽ in dấu vết ngăn xếp là thông tin cần thiết cho bất kỳ thông báo lỗi nào.
Như thế này:
from traceback import print_exc
class CustomException(Exception): pass
try:
raise CustomException("hi")
except Exception, e:
print 'type is:', e.__class__.__name__
print_exc()
# print "exception happened!"
Bạn sẽ nhận được đầu ra như thế này:
type is: CustomException
Traceback (most recent call last):
File "exc.py", line 7, in <module>
raise CustomException("hi")
CustomException: hi
Và sau khi in và phân tích, mã có thể quyết định không xử lý ngoại lệ và chỉ thực thi raise
:
from traceback import print_exc
class CustomException(Exception): pass
def calculate():
raise CustomException("hi")
try:
calculate()
except Exception, e:
if e.__class__ == CustomException:
print 'special case of', e.__class__.__name__, 'not interfering'
raise
print "handling exception"
Đầu ra:
special case of CustomException not interfering
Và phiên dịch in ngoại lệ:
Traceback (most recent call last):
File "test.py", line 9, in <module>
calculate()
File "test.py", line 6, in calculate
raise CustomException("hi")
__main__.CustomException: hi
Sau khi raise
ngoại lệ ban đầu tiếp tục truyền thêm lên ngăn xếp cuộc gọi. ( Cẩn thận với cạm bẫy có thể xảy ra ) Nếu bạn đưa ra ngoại lệ mới, nó sẽ theo dõi ngăn xếp ngăn xếp mới (ngắn hơn).
from traceback import print_exc
class CustomException(Exception): pass
def calculate():
raise CustomException("hi")
try:
calculate()
except Exception, e:
if e.__class__ == CustomException:
print 'special case of', e.__class__.__name__, 'not interfering'
#raise CustomException(e.message)
raise e
print "handling exception"
Đầu ra:
special case of CustomException not interfering
Traceback (most recent call last):
File "test.py", line 13, in <module>
raise CustomException(e.message)
__main__.CustomException: hi
Lưu ý cách truy nguyên không bao gồm calculate()
chức năng từ dòng 9
vốn là nguồn gốc của ngoại lệ ban đầu e
.
except:
(không có trầnraise
), ngoại trừ có thể một lần cho mỗi chương trình, và tốt nhất là không sau đó.