Fark kullandığınızda olmasıdır from
, __cause__
nitelik ayarlanır ve mesaj istisna edildiğini bildiren doğrudan kaynaklanır . Eğer from
o zaman hayır __cause__
ayarlanmışsa atlarsanız , ancak __context__
öznitelik de ayarlanmış olabilir ve geri izleme, başka bir şeyle uğraşırken bağlamı gösterir .
Ayar __context__
kullandığınız olur raise
bir özel durum işleyici; raise
başka bir yerde kullandıysanız __context__
, hayır da ayarlanmış demektir.
A __cause__
ayarlanırsa, __suppress_context__ = True
istisnada bir bayrak da ayarlanır; zaman __suppress_context__
olarak ayarlandığında True
, __context__
bir Traceback basarken göz ardı edilir.
Eğer bir istisna işleyicisinden yükseltirken yok bağlamını göstermek istiyorum (bir istemiyoruz başka istisna oldu taşıma sırasında , daha sonra kullanmak mesaj) raise ... from None
kümesine __suppress_context__
için True
.
Başka bir deyişle, Python istisnalar üzerine bir bağlam belirler, böylece bir istisnanın nerede ortaya çıktığını gözlemleyebilir ve bunun yerine başka bir istisnanın yerini alıp almadığınızı görebilirsiniz. Ayrıca , bir istisnanın nedenini ekleyerek izlemeyi diğer istisna hakkında açık hale getirebilirsiniz (farklı ifadeler kullanın) ve bağlam yok sayılır (ancak hata ayıklama sırasında yine de düşünülebilir). Tuşunu kullanarak raise ... from None
yazdırmak istediğiniz bağlamı gizleyebilirsiniz.
raise
İfade belgelerine bakın :
from
Maddesi durum zincirleme için kullanılır: verilirse, ikinci sentezleme sonra da yükseltilmiş haricinde bağlı olacaktır Başka bir özel sınıfı veya örneği, olmalıdır __cause__
(yazılabilir olan) öznitelik. Yükseltilen kural dışı durum ele alınmazsa, her iki kural dışı durum da yazdırılır:
>>> 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
Bir istisna işleyici veya finally
yan tümce içinde bir istisna ortaya çıkarsa benzer bir mekanizma örtük olarak çalışır : önceki istisna yeni istisnanın __context__
niteliği olarak eklenir :
>>> 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
Ayrıca , bağlamla ilgili ayrıntılar ve istisnalara eklenmiş neden bilgileri için Yerleşik İstisnalar belgelerine bakın.