2016-09-21 6 views
10

स्विफ्ट 3 में throws में फ़ंक्शन को कॉल करते समय, आपको सभी संभावित त्रुटियों को पकड़ने में पूर्ण होना चाहिए, जिसका अर्थ है कि आपके पास त्रुटियों को संभालने के अंत में अनावश्यक अतिरिक्त catch {} है।क्या मैं स्विफ्ट में फ़ंक्शन फेंकने वाले प्रकार को प्रतिबंधित कर सकता हूं?

क्या throws MyErrorType कहना संभव है कि संकलक यह जान सके कि आप वास्तव में संपूर्ण हैं जब आप उस गणना से सभी मामलों को संभालते हैं?

+4

नहीं, आप नहीं ... –

+1

संबंधित कर सकते हैं: http://stackoverflow.com/questions/30740997/what-is-the-difference-between-swift-2-0-do-try-catch-and-regular-java-cc-ex। –

उत्तर

2

फेंकने वाली त्रुटियों के साथ टाइप-सुरक्षित होने का कोई आसान तरीका नहीं है। इस पर विचार करें, यदि कंपाइलर ने आपको throws MyErrorType निर्दिष्ट करने की अनुमति दी है, तो उसे उस फ़ंक्शन बॉडी के भीतर भी सुनिश्चित करना होगा कि आप try फ़ंक्शन में नहीं हैं जो संभवतः एक डू/कैच ब्लॉक के बाहर एक अलग प्रकार को फेंक सकता है। (वैसे है लेकिन यह अनावश्यक जटिलता की परतों को जोड़ देगा)। स्विफ्ट कंपाइलर पहले से ही धीमा हो सकता है और प्रकारों को घुमाने के दौरान लूप में फंस सकता है, फेंकने वाले कार्यों की एक श्रृंखला ऊपर फेंकने वाले प्रकारों को घुमाने में एक दुःस्वप्न हो सकता है।

चल रहा विचार यह है कि अधिकांश त्रुटियों के लिए आप किसी भी तरह से तरीकों के एक छोटे से सबसेट में उन्हें संभालने जा रहे हैं।

कहा जा रहा है, वहाँ आप अतिरिक्त catch let error as MyErrorType खंड जोड़ने के लिए की आवश्यकता नहीं है, तो आप बस इतना की तरह एक कैच ब्लॉक में एक स्विच का उपयोग कर सकते हैं:

do { 
    try something() 
} catch let e { 
    switch e { 
    case let m as MyErrorType: handleMyError(m) 
    case let o as OtherErrorType: handleOther(o) 
    case is ThirdErrorType: print("error \(e)") 
    default: handleElse(e) 
    } 
} 
संबंधित मुद्दे

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