अंतर यह है कि जब आप उपयोग करते हैं 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
यह भी देखें निर्मित अपवाद प्रलेखन अपवाद से जुड़ी संदर्भ और कारण सूचना के आधार पर जानकारी के लिए।