अंतर यह है कि जब आप उपयोग करते हैं from
, तो __cause__
विशेषता सेट की जाती है और संदेश बताता है कि अपवाद सीधे कारण था । यदि आप छोड़ देते हैं from
तो कोई __cause__
सेट नहीं किया जाता है, लेकिन __context__
विशेषता के रूप में अच्छी तरह से सेट किया जा सकता है, और ट्रेसबैक तब संदर्भ को दिखाता है जैसे कि कुछ हुआ था ।
__context__
यदि आप raise
अपवाद हैंडलर में उपयोग करते हैं तो सेटिंग करना ; यदि आप raise
कहीं और इस्तेमाल करते हैं तो कोई __context__
भी सेट नहीं है।
यदि कोई __cause__
सेट है, __suppress_context__ = True
तो अपवाद पर एक ध्वज भी सेट किया गया है; जब __suppress_context__
सेट किया जाता है True
, तो __context__
ट्रेसबैक प्रिंट करते समय इसे अनदेखा कर दिया जाता है।
जब एक अपवाद संचालक जहां से ऊपर उठाने में नहीं आता संदर्भ दिखाना चाहते हैं (नहीं है एक चाहते से निपटने एक और अपवाद हुआ दौरान , तो का उपयोग संदेश) raise ... from None
सेट करने के लिए __suppress_context__
करने के लिए True
।
दूसरे शब्दों में, पायथन अपवादों पर एक संदर्भ निर्धारित करता है ताकि आप आत्मनिरीक्षण कर सकें कि एक अपवाद कहां उठाया गया था, आपको यह देखने देता है कि क्या कोई अन्य अपवाद इसके द्वारा प्रतिस्थापित किया गया था। आप एक अपवाद का कारण भी जोड़ सकते हैं , जिससे अन्य अपवाद के बारे में ट्रेसबैक स्पष्ट हो जाता है (विभिन्न शब्दों का उपयोग करें), और संदर्भ को नजरअंदाज कर दिया जाता है (लेकिन डिबगिंग के दौरान अभी भी आत्मनिरीक्षण किया जा सकता है)। उपयोग raise ... from None
करने से आप मुद्रित होने वाले संदर्भ को दबा सकते हैं।
raise
कथन को देखें :
from
खंड अपवाद श्रृंखलन के लिए प्रयोग किया जाता है: यदि दिया, दूसरी अभिव्यक्ति एक और अपवाद वर्ग या उदाहरण है, जो तब के रूप में उठाया अपवाद के साथ संलग्न किया जाएगा होना चाहिए __cause__
(जो लिखने योग्य है) विशेषता। यदि उठाए गए अपवाद को नियंत्रित नहीं किया जाता है, तो दोनों अपवाद मुद्रित होंगे:
>>> 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
यदि समान अपवाद हैंडलर या finally
क्लॉज के अंदर उठाया जाता है, तो एक समान तंत्र कार्य करता है : पिछले अपवाद को फिर नए अपवाद की __context__
विशेषता के रूप में संलग्न किया जाता है :
>>> 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
यह भी देखें निर्मित अपवाद प्रलेखन अपवाद से जुड़ी संदर्भ और कारण सूचना के आधार पर जानकारी के लिए।