2010-01-27 17 views
8

अपवाद बढ़ाने और बस एक त्रुटि मुद्रित करने के बीच क्या अंतर है।एक अपवाद बनाम प्रिंटिंग बढ़ाना?

उदाहरण के लिए, क्या निम्नलिखित का उपयोग कर के लाभ:

if size < 0: 
     raise ValueError('number must be non-negative') 
बजाय बस की

:

if size < 0: 
     print 'number must be non-negative' 

मैं एक नौसिखिया हूँ, तो कृपया उसे मुझ पर आसान ले लो। :)

+3

जब आपने इस कोड को आजमाया, तो आपने क्या अंतर देखा? –

उत्तर

8

Raising an error उस बिंदु पर पूरे कार्यक्रम रुकती है (जब तक अपवाद पकड़ा है), जबकि printing संदेश सिर्फ stdout के लिए कुछ लिखते हैं - उत्पादन एक और उपकरण को पहुंचाया जा सकता है, या किसी से अपने आवेदन नहीं चल रहे हैं कमांड लाइन, और print आउटपुट कभी नहीं देखा जा सकता है।

उदाहरण के लिए, क्या अपने कोड की तरह है अगर:

if size < 0: 
    print 'size must be non-negative' 
else: 
    print size * 4 

और मैं की तरह अपनी स्क्रिप्ट फोन:

yours.py number_source.txt | sum_all_lines.sh

यदि yours.py संख्याओं के बीच सादा पाठ आउटपुट करता है, तो शायद मेरा sum_all_lines.sh विफल हो जाएगा क्योंकि यह सभी संख्याओं की अपेक्षा कर रहा था। हालांकि, अगर yours.py अपवाद के कारण छोड़ देता है, तो sum_all_lines.sh समाप्त नहीं होगा, और यह स्पष्ट होगा कि राशि क्यों विफल रही।

बेशक, यह केवल एक उदाहरण है, और आपका विशेष मामला पूरी तरह से अलग हो सकता है।

+2

आपने इसे छोड़ा: http: //docs.python.org/reference/simple_stmts.html#the-raise-statement और http://docs.python.org/reference/simple_stmts.html#the-print-statement। –

6

यह निर्भर करता है कि आप उस बिंदु पर size < 0 को size < 0 पर देख सकते हैं। (

def divide_three_by(val): 
    if val == 0: 
    raise ValueError("Can't divide by 0") 
    return 3/val 

try: 
    divide_three_by(some_value_from_user) 
except ValueError: 
    print "You gave stupid input" 

में:

आपको तुरन्त मुद्रण, तो print से इसे संभाल कर सकते हैं, अन्यथा, एक अपवाद है, आगे callstack ऊपर कुछ करने के लिए है कि हालत से निपटने को सौंपने के लिए, इस तरह बढ़ा स्वीकार्य रूप से बहुत योगदान) ऊपर उदाहरण, divide_three_by फ़ंक्शन नहीं जानता है कि अगर आप 0 में गुजरते हैं तो क्या करना है - कभी-कभी आप केवल एक संदेश प्रिंट करना चाहते हैं (उदाहरण के लिए यदि val उपयोगकर्ता इनपुट से आया है), कभी-कभी आप इसे अनदेखा करना चाहेंगे , और एक डिफ़ॉल्ट मान असाइन करें। चूंकि फ़ंक्शन को नहीं पता कि क्या करना है, इसे उस स्थिति को कॉलस्टैक को जो कुछ भी कहा जाता है उसे संभालने की ज़िम्मेदारी लेनी चाहिए (और यदि इसे वहां संभाला नहीं जा सकता है, तो यह कॉलस्टैक को तब तक पारित रखेगा जब तक कि कुछ इसे संभाल नहीं लेता , या जब तक यह शीर्ष-स्तर तक पहुंच जाए, उस बिंदु पर आपका प्रोग्राम समाप्त हो जाएगा)।

पायथन में अपवादों को संभालने के लिए अधिक जानकारी के लिए - पाइथन दस्तावेज़ में Errors and Exceptions tutorial पर एक नज़र डालें।

+0

मुझे शायद यह इंगित करना चाहिए कि मेरा उदाहरण * अत्यधिक योगदान * है, 'ज़ीरोडिविजन एरर' (http://docs.python.org/library/exceptions.html#exceptions.ZeroDivisionError) के अस्तित्व को देखते हुए –

2

मुख्य अंतर यह है कि प्रोग्राम आपकी त्रुटि जांच के बाद चलना जारी रखेगा या नहीं।

इस मामले के लिए:

if size < 0: 
    print 'number must be non-negative' 

यह सिर्फ मानक आउटपुट और कार्यक्रम आपका चेक अतीत जारी रहेगा करने के लिए संदेश प्रिंट होगा।तो अगर किसी बिंदु पर बाद में आपके कोड में आप size का उपयोग करते हैं और यह 0 कम है तो आपको कोई त्रुटि मिल सकती है।

अन्य मामले के लिए:

if size < 0: 
    raise ValueError('number must be non-negative' 

इस मामले कार्यक्रम आपका चेक अतीत जारी नहीं होगा, एक अपवाद बढ़ा दी जाएगी। यदि इसे संभाला नहीं जाता है तो पूरा कार्यक्रम समाप्त हो जाएगा।

अधिकांश समय आप अपवाद उठाना चाहते हैं और अपवाद को पकड़ने वाले बाहरी अपवाद हैंडलर हैं और त्रुटि के बारे में उपयोग बताते हैं और यदि संभव हो तो उन्हें इनपुट पुनः दर्ज करने की अनुमति मिलती है।

3

एक और विचार तब होता है जब एक मॉड्यूल विकसित होता है जो शायद अन्य कार्यक्रमों में उपयोग किया जाता है। उस स्थिति में अपवाद फेंकना बेहतर है और कॉलिंग कोड को त्रुटि को संभालने दें। कॉलर को पता होना चाहिए कि कुछ गलत हो गया है और तदनुसार कार्य करता है।

... richie

संबंधित मुद्दे