Các Python documentation cho except
nói:Tại sao không sử dụng `except` của Python là` isinstance`?
Đối với một vế except với một biểu , biểu hiện đó là đánh giá, và các điều khoản phù hợp với ngoại lệ nếu đối tượng kết quả là “tương thích” với ngoại lệ. Một đối tượng tương thích với một ngoại lệ nếu nó là lớp hoặc một lớp cơ sở của đối tượng ngoại lệ, [...]
Tại sao không sử dụng except
isinstance
thay vì so sánh các lớp học cơ sở? Điều này ngăn cản việc sử dụng __instancecheck__
để ghi đè kiểm tra cá thể.
EDIT:
tôi có thể hiểu rằng một trong những lý do này không tồn tại là không ai coi nó. Nhưng có bất kỳ lý do tại sao điều này không nên được thực hiện?
EDIT:
Shell phiên từ Python 3.2a cho thấy cố gắng sử dụng __subclasscheck__
cho điều này không làm việc:
>>> class MyType(type): __subclasscheck__ = lambda cls, other_cls: True
>>> class O(Exception, metaclass=MyType): pass
>>> issubclass(3, O)
0: True
>>> issubclass(int, O)
1: True
>>> try:
... 1/0
... except O:
... print('Success')
Traceback (most recent call last):
File "<pyshell#4>", line 2, in <module>
1/0
ZeroDivisionError: division by zero
>>>
Tôi có thể liên hệ với thực tế là không ai coi nó. Tôi đoán những gì tôi yêu cầu là nếu có lý do chính đáng để không làm điều đó. * "nó có nghĩa là thực thi mã Python có khả năng tùy ý trong khi xử lý một ngoại lệ" *. Tôi nghĩ rằng tôi có thể đưa ra câu trả lời "người lớn đồng ý" cho điều đó-- Nếu ai đó muốn có một kiểm tra cá thể tùy chỉnh trong xử lý ngoại lệ của mình, tại sao không để cho anh ta? –