Perbedaannya adalah bahwa ketika Anda menggunakan from
, __cause__
atribut ditetapkan dan pesan menyatakan bahwa pengecualian itu secara langsung disebabkan oleh . Jika Anda menghilangkan from
maka 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 raise
penangan pengecualian; jika Anda digunakan di raise
tempat lain tidak ada __context__
yang diatur.
Jika a __cause__
diatur, __suppress_context__ = True
bendera 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 None
untuk 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 None
memungkinkan Anda menekan konteks yang sedang dicetak.
Lihat raise
dokumentasi pernyataan :
The from
klausul 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 finally
klausa: 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.