Sự khác biệt là khi bạn sử dụng from
, __cause__
thuộc tính được đặt và thông báo cho biết ngoại lệ được gây ra trực tiếp bởi . Nếu bạn bỏ qua from
thì không __cause__
được đặt, nhưng __context__
thuộc tính cũng có thể được đặt và truy nguyên sau đó hiển thị bối cảnh như trong khi xử lý một cái gì đó khác đã xảy ra .
Đặt điều __context__
xảy ra nếu bạn sử dụng raise
trong một trình xử lý ngoại lệ; nếu bạn sử dụng raise
bất cứ nơi nào khác thì không __context__
được đặt.
Nếu a __cause__
được đặt, một __suppress_context__ = True
cờ cũng được đặt trên ngoại lệ; khi __suppress_context__
được đặt thành True
, __context__
sẽ bị bỏ qua khi in dấu vết.
Khi nâng lên từ một trình xử lý ngoại lệ mà bạn không muốn hiển thị ngữ cảnh (không muốn trong khi xử lý một thông báo ngoại lệ khác xảy ra ), sau đó sử dụng raise ... from None
để đặt __suppress_context__
thànhTrue
.
Nói cách khác, Python đặt bối cảnh cho các trường hợp ngoại lệ để bạn có thể hướng nội nơi một ngoại lệ được đưa ra, cho bạn biết nếu một ngoại lệ khác được thay thế bởi nó. Bạn cũng có thể thêm một nguyên nhân vào một ngoại lệ, làm cho dấu vết rõ ràng về ngoại lệ khác (sử dụng từ ngữ khác) và bối cảnh bị bỏ qua (nhưng vẫn có thể bị thâm nhập khi gỡ lỗi). Sử dụngraise ... from None
cho phép bạn ngăn chặn bối cảnh được in.
Xem thông raise
tin tuyên bố :
Các from
khoản được sử dụng cho ngoại lệ chaining: nếu được, thứ hai biểu hiện phải khác lớp ngoại lệ hoặc dụ, sau đó sẽ được gắn vào ngoại lệ huy động là __cause__
thuộc tính (đó là ghi). Nếu ngoại lệ nâng lên không được xử lý, cả hai ngoại lệ sẽ được in:
>>> try:
... print(1 / 0)
... except Exception as exc:
... raise RuntimeError("Something bad happened") from exc
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened
Một cơ chế tương tự hoạt động ngầm nếu một ngoại lệ được đưa ra bên trong một trình xử lý ngoại lệ hoặc một finally
mệnh đề: ngoại lệ trước đó được đính kèm dưới dạng __context__
thuộc tính của ngoại lệ mới :
>>> try:
... print(1 / 0)
... except:
... raise RuntimeError("Something bad happened")
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: int division or modulo by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened
Đồng thời xem tài liệu Ngoại lệ tích hợp để biết chi tiết về ngữ cảnh và gây ra thông tin kèm theo ngoại lệ.