प्रयास करें प्रयास करें! & प्रयत्न? क्या अंतर है, और प्रत्येक का उपयोग कब करना है?


172

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

जवाबों:


316

स्विफ्ट 5.1 के लिए अपडेट किया गया

निम्नलिखित फेंकने की क्रिया मान लें:

enum ThrowableError: Error {

    case badError(howBad: Int)
}

func doSomething(everythingIsFine: Bool = false) throws -> String {

  if everythingIsFine {
      return "Everything is ok"
  } else {
      throw ThrowableError.badError(howBad: 4)
  }
}

प्रयत्न

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

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

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

    // 1. Handle
    print("Bad Error (How Bad Level: \(howBad)")

    // 2. Re-throw
    throw ThrowableError.badError(howBad: howBad)
}

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

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

प्रयत्न!

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

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

प्रयत्न?

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

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

या हम गार्ड का उपयोग कर सकते हैं:

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

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

सहवर्ती संचालक का उपयोग करना ??

आप कोलेसिंग ऑपरेटर का उपयोग कर सकते हैं ?? कोशिश के साथ? विफलता का डिफ़ॉल्ट मान प्रदान करने के लिए:

let result = (try? doSomething()) ?? "Default Value"
print(result) // Default Value

आपका दूसरा कोड नमूना ( let result = try doSomething() // Not within a do-catch block) एक विधि के भीतर से बुलाया जाना है जिसे throwsसही घोषित किया गया है ? तो, यदि doSomething()विफल रहता है, तो बाहरी विधि भी (बदले में) करती है?
निकोलस मिआरी

पुराने धागे और सभी लेकिन मैंने पाया कि आज (स्विफ्ट 4, एक्सकोड 9.1) कोशिश करते हैं? परिणाम को स्वत: खोलना नहीं है। यह आपको इसे मैन्युअल रूप से अनचेक करने के लिए एक सामान्य विकल्प के रूप में छोड़ देता है। निश्चित नहीं है कि यह स्विफ्ट 2/3 के बाद से बदल गया है, लेकिन यह डॉक्स के अनुसार है: developer.apple.com/library/content/documentation/Swift/… ( वैकल्पिक मानों में त्रुटियों को परिवर्तित करते हुए देखें )। कोशिश btw के महान विवरण।
the_dude_abides

1
स्विफ्ट 4 में, कोशिश करें? मेरी परियोजना में 'कोशिश' के भाव के भीतर होने वाले फ़ंक्शन को कॉल करने के लिए कोई कॉल नहीं निकालता है।
अज़लीनताओ

7
तुम भी इस्तेमाल कर सकते हैं try?के साथ ??तो यह आप एक पंक्ति में एक डिफ़ॉल्ट मान निर्दिष्ट कर सकते हैं होगा:let something:String = (try? whateverIfItThrows()) ?? "Your default value here"
itMaxence
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.