स्विफ्ट 2 त्रुटि हैंडलिंग मॉडल के दो महत्वपूर्ण बिंदु हैं: थकावट और लचीलापन। साथ में, वे हर संभव त्रुटि को पकड़ने के लिए आपके do/ catchकथन को उबालते हैं , न कि केवल उन लोगों को जिन्हें आप जानते हैं कि आप फेंक सकते हैं।
ध्यान दें कि आप यह घोषित नहीं करते हैं कि एक फ़ंक्शन किस प्रकार की त्रुटियों को फेंक सकता है, केवल यह कि क्या यह बिल्कुल फेंकता है। यह एक शून्य-एक प्रकार की समस्या है: जैसे कोई व्यक्ति अपने भविष्य के लिए (अपने भविष्य के स्वयं सहित) किसी फ़ंक्शन को उपयोग करने के लिए परिभाषित करता है, आप अपने फ़ंक्शन के प्रत्येक ग्राहक को अपने कार्यान्वयन में हर परिवर्तन के लिए अनुकूल नहीं बनाना चाहते हैं फ़ंक्शन, यह क्या त्रुटियों को शामिल कर सकता है। आप ऐसा कोड चाहते हैं जो आपके फ़ंक्शन को ऐसे परिवर्तन के प्रति लचीला होने के लिए कहता है।
क्योंकि आपका फ़ंक्शन यह नहीं कह सकता है कि यह किस प्रकार की त्रुटियां फेंकता है (या भविष्य में फेंक सकता है), इसे catchब्लॉक करने वाले त्रुटियों को नहीं जानते हैं कि यह किस प्रकार की त्रुटियों को फेंक सकता है। इसलिए, आपके द्वारा ज्ञात त्रुटि प्रकारों को संभालने के अलावा, आपको उन लोगों को संभालने की आवश्यकता है जिन्हें आप सार्वभौमिक catchकथन के साथ नहीं रखते हैं - इस तरह यदि आपका फ़ंक्शन भविष्य में फेंकी जाने वाली त्रुटियों के सेट को बदल देता है, तो कॉलर्स अभी भी इसे पकड़ लेंगे त्रुटियों।
do {
let sandwich = try makeMeSandwich(kitchen)
print("i eat it \(sandwich)")
} catch SandwichError.NotMe {
print("Not me error")
} catch SandwichError.DoItYourself {
print("do it error")
} catch let error {
print(error.localizedDescription)
}
लेकिन वहां रुकने नहीं दिया। इस लचीलापन विचार के बारे में कुछ और सोचें। जिस तरह से आपने अपने सैंडविच को डिज़ाइन किया है, आपको हर जगह त्रुटियों का वर्णन करना होगा जहाँ आप उनका उपयोग करते हैं। इसका मतलब है कि जब भी आप त्रुटि मामलों के सेट को बदलते हैं, तो आपको हर जगह को बदलना होगा जो उनका उपयोग करता है ... बहुत मज़ेदार नहीं।
अपनी स्वयं की त्रुटि प्रकारों को परिभाषित करने के पीछे का विचार आपको इस तरह की चीजों को केंद्रीकृत करने देना है। आप descriptionअपनी त्रुटियों के लिए एक विधि परिभाषित कर सकते हैं:
extension SandwichError: CustomStringConvertible {
var description: String {
switch self {
case NotMe: return "Not me error"
case DoItYourself: return "Try sudo"
}
}
}
और फिर आपका त्रुटि हैंडलिंग कोड आपके त्रुटि प्रकार को स्वयं का वर्णन करने के लिए कह सकता है - अब हर जगह जहां आप त्रुटियों को संभालते हैं, उसी कोड का उपयोग कर सकते हैं, और भविष्य के संभावित त्रुटि मामलों को भी संभाल सकते हैं।
do {
let sandwich = try makeMeSandwich(kitchen)
print("i eat it \(sandwich)")
} catch let error as SandwichError {
print(error.description)
} catch {
print("i dunno")
}
यह रिपोर्टिंग त्रुटियों के अन्य तरीकों का समर्थन करने के लिए त्रुटि प्रकार (या उन पर एक्सटेंशन) का मार्ग भी प्रशस्त करता है - उदाहरण के लिए, आपके पास अपने त्रुटि प्रकार पर एक एक्सटेंशन हो सकता है जो जानता है कि UIAlertControlleriOS उपयोगकर्ता को त्रुटि की रिपोर्ट करने के लिए कैसे प्रस्तुत किया जाए ।