Fark kullandığınızda olmasıdır from, __cause__nitelik ayarlanır ve mesaj istisna edildiğini bildiren doğrudan kaynaklanır . Eğer fromo 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 raisebir özel durum işleyici; raisebaşka bir yerde kullandıysanız __context__, hayır da ayarlanmış demektir.
A __cause__ayarlanırsa, __suppress_context__ = Trueistisnada 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 Nonekü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 Noneyazdırmak istediğiniz bağlamı gizleyebilirsiniz.
raiseİfade belgelerine bakın :
fromMaddesi 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 finallyyan 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.