क्या कोष्ठक के बिना "बढ़ा अपवाद ()" और "अपवाद को बढ़ाने" के बीच अंतर है?


100

एक पैरामीटर रहित अपवाद को परिभाषित करना:

class MyException(Exception):
    pass

जब उठाया जाता है, तो क्या कोई अंतर है:

raise MyException

तथा

raise MyException()

मुझे कोई नहीं मिला; क्या यह केवल एक अतिभारित वाक्यविन्यास है?


1
इस उत्तर को पढ़ें: stackoverflow.com/questions/13052991/…
satoru

1
कड़ाई से बोलना यह वाक्यात्मक नहीं है। पायथन को पता नहीं चल सकता है कि रनटाइम तक उसे क्लास मिलेगी या इंस्टेंस।
asmeurer

जवाबों:


116

संक्षिप्त उत्तर यह है कि दोनों raise MyExceptionऔरraise MyException() एक ही बात करते हैं। यह पहला फ़ॉर्म ऑटो आपके अपवाद को तत्काल बताता है।

डॉक्स से प्रासंगिक अनुभाग कहते हैं, " बढ़ाने अपवाद वस्तु के रूप में पहली अभिव्यक्ति मूल्यांकन करता है। यह या तो एक उपवर्ग या BaseException का एक उदाहरण होना चाहिए। यदि यह एक वर्ग है, अपवाद उदाहरण है जब साथ वर्ग instantiating द्वारा आवश्यक प्राप्त की जाएगी कोई तर्क नहीं। "

कहा कि, शब्दार्थ समान होते हुए भी, पहला रूप सूक्ष्म रूप से तेज होता है, और दूसरा रूप अधिक लचीला होता है (क्योंकि जरूरत पड़ने पर आप इसे तर्क पास कर सकते हैं)।

पाइथन (सामान्य पुस्तकालय में, लोकप्रिय अनुप्रयोगों में, और कई पुस्तकों में) का उपयोग करने वाली सामान्य शैली का उपयोग raise MyExceptionतब किया जाता है जब कोई तर्क नहीं होता है। लोग केवल उस अपवाद को तुरंत समाप्त कर देते हैं जब कुछ तर्क पारित करने की आवश्यकता होती है। उदाहरण के लिए raise KeyError(badkey):।


18
पहला रूप (कोष्ठक के बिना) सूक्ष्म रूप से तेज क्यों होगा?
jamesdlin

15
@jamesdlin क्योंकि ऑटो कोड के लिए C कोड की वजह से ओवरहेड की व्याख्या नहीं होती है, जिससे आप खुद कॉल करते हैं।
रेमंड हेटिंगर

4

पर जाओ देखो के लिये दस्तावेज raiseबयान । इसका एक उदाहरण बना रहा है MyException


1
यह ध्यान देने योग्य है कि पाइथन 3 में वाक्यविन्यासraise थोड़ा बदल गया है। इस प्रश्न के लिए प्रासंगिक हिस्सा वही है, हालांकि ( raise ExceptionTypeअभी भी कोई तर्क के साथ इसके निर्माता को कॉल करके प्रकार का एक उदाहरण बनाता है)।
ब्लेकनाथ

0

हां, ValueErrorऔर दोनों के बीच अंतर हैValueError()

ValueErrorएक वर्ग है जबकि एक वर्ग का ValueError()एक उदाहरण बनाता है। यही कारण है type(ValueError) is typeऔरtype(ValueError()) is ValueError

इसका एकमात्र उद्देश्य raiseअपवाद उठाना है,

जब हम उपयोग करते हैं ValueError, तो क्लास को बुलाया जाएगा जो बदले में कंस्ट्रक्टर चलाता है ValueError()

जब हम उपयोग करते हैं ValueError(), तो विधि ValueError()को सीधे कहा जाता है।

ध्यान दें: raise ValueError # shorthand for 'raise ValueError()'

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.