2016-10-21 11 views
6

तो मैं थोड़ी देर के लिए अजगर सीख रहा हूं और उठाने का कार्य और जोर दे रहा हूं (मुझे क्या एहसास हुआ कि दोनों ही ऐप को दुर्घटनाग्रस्त करते हैं, कोशिश करने के विपरीत - वास्तव में समान) और मैं नहीं कर सकता एक ऐसी स्थिति देखें जहां आप कोशिश पर उठो या दावा का उपयोग करेंगे।राइज कोशिश करें और सम्मिलित करें

+1

आप मानते हैं कि raise, जोर देने या कोशिश करने के बीच कोई विकल्प है, लेकिन हकीकत में वे एक दूसरे के बदले नहीं हैं। इसके अलावा आपने एक सवाल नहीं पूछा। – tcooc

+1

धन्यवाद tcoc! मेरे पास वास्तव में एक सवाल था, हालांकि, अगर कोई मुझे एक स्थिति दिखा सकता है तो आप केवल इन कार्यों में से किसी एक का उपयोग कर सकते हैं। – Defneit

+1

@Defneit पाइथन दस्तावेज़ों में ऐसे उदाहरण हैं। इसके अलावा आपको प्रश्न में अपने प्रश्न पूछना चाहिए, टिप्पणी में नहीं। – Goyo

उत्तर

7

जोर:

प्रयुक्त जब आप एक निश्चित स्थिति के आधार पर "रोक" करने के लिए स्क्रिप्ट और वापसी कुछ तेजी से डिबग मदद करना चाहते हैं:

list_ = ["a","b","x"] 
assert "x" in list_, "x is not in the list" 
print("passed") 
#>> prints passed 

list_ = ["a","b","c"] 
assert "x" in list_, "x is not in the list" 
print("passed") 
#>> 
Traceback (most recent call last): 
    File "python", line 2, in <module> 
AssertionError: x is not in the list 

बढ़ाएं:

दो इसके कारण उपयोगी है:

1/कोशिश करने के लिए और ब्लॉक को छोड़कर उपयोग किया जाना चाहिए। अपनी पसंद की त्रुटि बढ़ाएं, नीचे की तरह कस्टम हो सकती है और यदि आप pass या contiune स्क्रिप्ट को स्क्रिप्ट को रोक नहीं सकते हैं; या पूर्वनिर्धारित किया जा सकता है त्रुटियों raise ValueError()

class Custom_error(BaseException): 
    pass 

try: 
    print("hello") 
    raise Custom_error 
    print("world") 
except Custom_error: 
    print("found it not stopping now") 

print("im outside") 

>> hello 
>> found it not stopping now 
>> im outside 

देखा यह नहीं रोका? हम इसे छोड़कर ब्लॉक में बाहर निकलने (1) का उपयोग करके इसे रोक सकते हैं।

2/वृद्धि का उपयोग स्टैक को पास करने के लिए वर्तमान त्रुटि को फिर से शुरू करने के लिए भी किया जा सकता है ताकि यह देखने के लिए कि कुछ और इसे संभाल सकता है या नहीं।

except SomeError, e: 
    if not can_handle(e): 
      raise 
    someone_take_care_of_it(e) 

ब्लॉक को छोड़कर कोशिश /:

आप क्या सोचते हैं वास्तव में करता है, कुछ की कोशिश करता है, एक त्रुटि ऊपर आता है आप इसे पकड़ने और इसके साथ सौदा कैसे कभी आप की तरह है। कोई उदाहरण नहीं है क्योंकि ऊपर एक है।

4
assert cond, "text" 

तरह

if cond == False: 
    raise AssertionError("text") 

उपयोग ज़ोर कुछ करने के लिए विस्तारित, क्योंकि यह अधिक पठनीय है।

+0

बहुत बहुत धन्यवाद! अब और अधिक समझ में आता है! – Defneit

+0

लघु और कुरकुरा, धन्यवाद :) –

5

raise - एक अपवाद उठाएं।

assert - अपवाद बढ़ाएं यदि एक दी गई शर्त सत्य है (या नहीं)।

try - कुछ कोड निष्पादित करें जो अपवाद बढ़ा सकता है, और यदि ऐसा है, तो इसे पकड़ें।

1

अपवाद हैं जो पाइथन (और कुछ अन्य भाषाएं) कोड निष्पादित करते समय उत्पन्न होने वाली त्रुटियों से निपटने के लिए उपयोग करते हैं। raise ExceptionName कह रहा है कि कोड में कोई त्रुटि है, और यह निर्दिष्ट करता है कि उस समस्या से जुड़े अपवाद को उठाकर यह किस प्रकार की समस्या है। assert expressionexpression का मूल्यांकन करें और यदि यह गलत है तो अपवाद उठाता है।

try कोड को निष्पादित करने के लिए उपयोग किया जाता है जो आपके द्वारा अपेक्षित अपवाद को बढ़ा सकता है। कार्यक्रम को रोकने के बजाय, आप अपवाद को "पकड़ सकते हैं" और अपने कोड में इसके साथ सौदा कर सकते हैं।

उदाहरण: मान लीजिए कि आपके पास एक शब्दकोश और एक सूची है।

try: 
    for item in my_list: 
     print(my_dictionary[item]) 
except KeyError as e: #KeyError is the Exception raised when a key is not in a dictionary 
    print('There is no {} in the dictionary'.format(e.args[0])) 
+0

बहुत बहुत धन्यवाद! अब मैं आपको धन्यवाद कोडिंग जारी रख सकता हूं! – Defneit

3

try/except ब्लॉक तुम्हें पकड़ और अपवादों का प्रबंधन करते हैं: आप जब तक आप एक है कि शब्दकोश में नहीं है तक पहुँचने के शब्दकोश में सूची से बातें देखने के लिए चाहते हैं। अपवादों को raise, assert द्वारा ट्रिगर किया जा सकता है, और बड़ी संख्या में त्रुटियों जैसे कि खाली सूची को अनुक्रमणित करने का प्रयास किया जा सकता है। raise आमतौर पर तब उपयोग किया जाता है जब आपको त्रुटि स्थिति मिली है। assert समान है लेकिन अपवाद केवल तभी उठाया जाता है जब कोई शर्त पूरी हो जाती है।

raise और assert का एक अलग दर्शन है। कोड में कई "सामान्य" त्रुटियां हैं जिन्हें आप पहचानते हैं और त्रुटियां बढ़ाते हैं। शायद एक वेबसाइट मौजूद नहीं है या पैरामीटर मान सीमा से बाहर है।

दावे आम तौर पर "मैं कसम खाता हूं" मुद्दों के लिए आरक्षित हैं जो वैसे भी होने वाले प्रतीत होते हैं। सामान्य रनटाइम त्रुटि पहचान से रनटाइम डीबगिंग की तरह यह अधिक है। यदि आप ध्वज का उपयोग करते हैं या फ़ाइलों से फ़ाइलों की बजाय फ़ाइलों का उपयोग करते हैं तो उन्हें अक्षम किया जा सकता है, इसलिए उन्हें नियमित त्रुटि का पता नहीं होना चाहिए।

यदि उत्पादन गुणवत्ता कोड एक अपवाद उठाता है, तो पता लगाएं कि आपने क्या किया है। यदि यह AssertionError उठाता है, तो आपको एक बड़ी समस्या मिली है।

+0

आपको बहुत धन्यवाद। मुझे बहुत मदद मिली – Defneit

1

जोर आम तौर पर परीक्षण कोड द्वारा किया जाता है सुनिश्चित करने के लिए है कि कुछ काम किया:

def test_bool(): 
    assert True != False 

कहाँ के रूप में की कोशिश, बढ़ा और मेकअप अपवाद हैंडलिंग जो अजगर में पसंदीदा तरीका संभाल और त्रुटियों का प्रचार करने के सिवाय।

अधिकांश लाइब्रेरी और पायथन बिल्ट-इन्स उठाएंगे और कुछ गलत होने पर एक प्रकार या किसी अन्य का अपवाद होगा। अक्सर जब आप कुछ गलत होने का पता लगाते हैं तो आप अपने कोड में अपवाद भी उठाना चाहते हैं। मान लें कि एक उदाहरण के रूप में आप एक ईमेल पता सत्यापनकर्ता लिख ​​रहे थे और यदि पता में @ चिह्न नहीं था तो आप अपवाद उठाना चाहते थे। तुम कुछ की तरह (यह खिलौना कोड है वास्तव में इस प्रकार के ईमेल को मान्य नहीं है,) हो सकता है:

def validate_email(address): 
    if not "@" in address: 
     raise ValueError("Email Addresses must contain @ sign") 

फिर कहीं और अपने कोड में आप validate_email समारोह कॉल कर सकते हैं और अगर यह विफल रहता है एक अपवाद फेंक दिया जाएगा।

try: 
    validate_email("Mynameisjoe.com") 
except ValueError as ex: 
    print("We can do some special invalid input handling here, Like ask the user to retry the input") 
finally: 
    close_my_connection() 
    print("Finally always runs whether we succeed or not. Good for clean up like shutting things down.") 

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

if __name__ == '__main__': 
    try: 
     print(1/0) 
    except Exception as ex: 
     pass 

अब आप जानते हुए भी क्यों अपने आवेदन ऊपर विस्फोट से उड़ा दिया का कोई तरीका नहीं:

एक बात आपको बस इतना करना नहीं चाहते की तरह कुछ है।

import logging 
if __name__ == '__main__': 
    try: 
     print(1/0) 
    except Exception as ex: 
     logging.exception(ex) 
     raise 

इस मामले के बाद से यह कोई पैरामीटर वही त्रुटि फिर से उठाती है में उठाने:

एक बात आप अक्सर देखेंगे जो ठीक है की तरह कुछ है। अक्सर वेब कोड में आप ऐसा कुछ देखेंगे जो अपवाद को फिर से नहीं उठाता है क्योंकि यह क्लाइंट को 500 त्रुटि भेज देगा और फिर अगले अनुरोध के साथ आगे बढ़ेगा, इसलिए उस स्थिति में आप प्रोग्राम को समाप्त नहीं करना चाहते हैं।

+0

बहुत बहुत धन्यवाद – Defneit

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