Perbedaannya adalah bahwa ketika Anda menggunakan from, __cause__atribut ditetapkan dan pesan menyatakan bahwa pengecualian itu secara langsung disebabkan oleh . Jika Anda menghilangkan frommaka tidak __cause__diatur, tetapi __context__atribut dapat diatur juga, dan traceback kemudian menunjukkan konteks saat menangani sesuatu yang lain terjadi .
Pengaturan __context__terjadi jika Anda menggunakan raisepenangan pengecualian; jika Anda digunakan di raisetempat lain tidak ada __context__yang diatur.
Jika a __cause__diatur, __suppress_context__ = Truebendera juga diatur pada pengecualian; ketika __suppress_context__diatur ke True, __context__diabaikan ketika mencetak traceback.
Ketika mengangkat dari penangan pengecualian di mana Anda tidak ingin menampilkan konteks (tidak ingin selama menangani pengecualian terjadi pesan lain), kemudian gunakan raise ... from Noneuntuk mengatur __suppress_context__ke True.
Dengan kata lain, Python menetapkan konteks pada pengecualian sehingga Anda dapat mengintrospeksi di mana pengecualian muncul, membiarkan Anda melihat apakah pengecualian lain digantikan olehnya. Anda juga dapat menambahkan penyebab ke pengecualian, membuat traceback eksplisit tentang pengecualian lain (menggunakan kata-kata yang berbeda), dan konteksnya diabaikan (tetapi masih dapat diintrospeksi saat debugging). Menggunakan raise ... from Nonememungkinkan Anda menekan konteks yang sedang dicetak.
Lihat raisedokumentasi pernyataan :
The fromklausul digunakan untuk pengecualian chaining: jika diberikan, kedua ekspresi harus menjadi kelas pengecualian lain atau misalnya, yang kemudian akan melekat pengecualian mengangkat sebagai __cause__atribut (yang ditulis). Jika pengecualian yang diangkat tidak ditangani, kedua pengecualian akan dicetak:
>>> 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
Mekanisme serupa bekerja secara implisit jika pengecualian muncul di dalam handler pengecualian atau finallyklausa: pengecualian sebelumnya kemudian dilampirkan sebagai __context__atribut pengecualian baru :
>>> 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
Juga lihat dokumentasi Pengecualian bawaan untuk detail tentang konteks dan menyebabkan informasi terlampir pada pengecualian.