2015-09-04 6 views
91

Swift 2.0 में, ऐप्पल ने त्रुटियों को संभालने के लिए एक नया तरीका पेश किया (कोशिश-प्रयास)। और बीटा 6 में कुछ दिन पहले एक नया कीवर्ड भी पेश किया गया था (try?)। इसके अलावा, मुझे पता था कि मैं try! का उपयोग कर सकता हूं। 3 कीवर्ड के बीच क्या अंतर है, और प्रत्येक का उपयोग कब करें?कोशिश करें, कोशिश करें! & प्रयत्न? क्या अंतर है, और प्रत्येक का उपयोग कब करें?

उत्तर

187

निम्नलिखित फेंकने समारोह मान लें:

enum ThrowableError : ErrorType { case BadError } 

func doSomething() throws -> String { 
    if everythingIsFine { 
     return "Everything is ok" 
    } else { 
     throw ThrowableError.BadError 
    } 
} 

कोशिश

जब आप एक समारोह है कि फेंक सकता है से कॉल करके आप 2 विकल्प हैं।

आप एक do-पकड़ ब्लॉक के भीतर अपने कॉल आसपास के द्वारा निपटने त्रुटियों की जिम्मेदारी लेने के कर सकते हैं:

do { 
    let result = try doSomething() 
} 
catch { 
    // Here you know about the error 
    // Feel free to handle to re-throw 
} 

या बस समारोह कॉल करने का प्रयास है, और में अगले फोन करने वाले को साथ त्रुटि पारित कॉल श्रृंखला:

func doSomeOtherThing() throws -> Void {  
    // Not within a do-catch block. 
    // Any errors will be re-thrown to callers. 
    let result = try doSomething() 
}

कोशिश करें!

क्या होता है जब आप इसके अंदर एक नील के साथ एक स्पष्ट रूप से अनचाहे वैकल्पिक तक पहुंचने का प्रयास करते हैं? हाँ, सच है, ऐप क्रैश होगा! वही प्रयास के साथ चला जाता है! यह मूल रूप से त्रुटि श्रृंखला को अनदेखा करता है, और "डू या मर" स्थिति घोषित करता है। यदि बुलाया गया फ़ंक्शन किसी भी त्रुटि को फेंक नहीं देता है, तो सब कुछ ठीक हो जाता है। लेकिन अगर यह असफल हो गया और एक त्रुटि फेंक दी, आपका आवेदन बस को क्रैश करेगा।

let result = try! doSomething() // if an error was thrown, CRASH! 

कोशिश करें?

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

if let result = try? doSomething() { 
    // doSomething succeeded, and result is unwrapped. 
} else { 
    // Ouch, doSomething() threw an error. 
} 

या हम नए भयानक गार्ड कीवर्ड का उपयोग कर सकते हैं:, try? ध्यान दें कि आप त्रुटि है कि जगह ले ली को त्यागकर रहे हैं का उपयोग करके

guard let result = try? doSomething() else { 
    // Ouch, doSomething() threw an error. 
} 
// doSomething succeeded, and result is unwrapped. 

एक अंतिम टिप्पणी यहाँ, के रूप में यह एक शून्य में अनुवाद किया है। कोशिश का प्रयोग करें? जब आप सफलताओं और विफलता पर अधिक ध्यान केंद्रित कर रहे हैं, तो क्यों नहीं चीजें विफल रहीं।

+0

आपका दूसरा कोड नमूना ('परिणाम दें = कोशिश करें कुछ() // एक डू-कैच ब्लॉक के भीतर नहीं) को 'थ्रो' के रूप में घोषित विधि के भीतर से बुलाया जाना है, है ना? तो, अगर 'कुछ करना() 'विफल रहता है, तो बाहरी विधि भी बदले में (बदले में)? –

+0

हां, यकीन है। मैं तदनुसार संपादित करूंगा। – Abdurrahman

+1

गार्ड सुसमाचार का प्रचार करने के लिए उपरोक्त –

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