2016-01-19 8 views
9

स्विफ्ट के साथ अब कुछ फ़ंक्शन throws के साथ चिह्नित हैं, और यह बल डेवलपर्स को do - try catch ब्लॉक के अंदर फ़ंक्शन कॉल करने के लिए मजबूर करता है। लेकिन डेवलपर उस फ़ंक्शन द्वारा फेंकने वाले विभिन्न अपवादों की सूची कैसे जान सकता है?फ़ंक्शन द्वारा फेंकने वाली त्रुटियों की सूची कैसे प्राप्त करें?

static void employeeAge(int age) throws MyExceptionA,MyExceptionB 

यहाँ स्पष्ट है कि अपवाद 2 MyExceptionA और MyExceptionB हैं और डेवलपर अलग तरह से कार्य त्रुटि के निर्भर करता है करने का फैसला कर सकते हैं:

संदर्भ के रूप में, यहाँ जावा कोड की एक पंक्ति है।

क्या हम इसे स्विफ्ट पर प्राप्त कर सकते हैं?

+0

Unfortanely, आप dokumentation (एपीआई) की जांच करने के लिए है। सावधान रहें, कोई अपवाद फेंकने में कोई त्रुटि नहीं है। यदि आप अपने कोड के प्रवाह को व्यवस्थित करने के तरीके की तलाश में हैं, तो इसके बजाय उचित जांच का उपयोग करें। फेंकने की त्रुटि पकड़ना आपके द्वारा पुनर्प्राप्त करने का आखिरी मौका है, आप अपवाद से पुनर्प्राप्त नहीं कर पा रहे हैं। – user3441734

+0

[यह संबंधित प्रश्न और स्वीकृत उत्तर भी देखें।] (Http://stackoverflow.com/questions/31977738/how-to-find-the-kind-of-errors-a-method-may-throw-and- पकड़-इन-इन-स्विफ्ट) – Suragch

उत्तर

4

की डो-पकड़ने का उपयोग करते हुए स्विफ्ट डॉक्स एक समारोह throws कहते हैं, वे इसका मतलब यह है कि यह एक ErrorType फेंकता (कोको एपीआई आम तौर पर एक NSError में), एक अपवाद नहीं।

let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] 

do { 
    try NSFileManager.defaultManager().createDirectoryAtPath(documentsPath, withIntermediateDirectories: false, attributes: nil) 
} catch { 
    // 'error' variable automatically populated 
    print(error) 
    print(error.dynamicType) 
} 

createDirectoryAtPath असफल हो जायेगी क्योंकि दस्तावेजों निर्देशिका पहले से मौजूद:

NSFileManager के createDirectoryAtPath निम्नलिखित do-try-catch प्रवाह पर विचार करें। error की dynamicType लॉगिंग से पता चलता है कि यह एक NSError वस्तु वास्तव में है:

Error Domain=NSCocoaErrorDomain Code=516 "The file “Documents” couldn’t be saved in the folder “35B0B3BF-D502-4BA0-A991-D07568AB87C6” because a file with the same name already exists." UserInfo={NSFilePath=/Users/jal/Library/Developer/CoreSimulator/Devices/E8A35774-C9B7-42F0-93F1-8103FBBC7118/data/Containers/Data/Application/35B0B3BF-D502-4BA0-A991-D07568AB87C6/Documents, NSUnderlyingError=0x7fa88bd14410 {Error Domain=NSPOSIXErrorDomain Code=17 "File exists"}} 

NSError 

क्रम त्रुटियों के विभिन्न प्रकार को देखने के लिए एक समारोह throw, आप जानकारी के लिए error की जांच करने के लिए होता कर सकते हैं फेंकने वाले त्रुटि के प्रकार को निर्धारित करने के लिए, और प्रत्येक त्रुटि को कैसे संभालें। NSError के मामले में यह उसका डोमेन, कोड और विवरण होगा।

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

+1

इसके अलावा, 'शुद्ध' स्विफ्ट की त्रुटि है ... केवल आवश्यकता है कि त्रुटि फेंक त्रुटि त्रुटि टाइप प्रोटोकॉल के अनुरूप है। इसका मतलब यह नहीं है कि यह एक एनएसईआरआरआर वस्तु है। – user3441734

+0

@ user3441734 मुझे कोको टच एपीआई या डॉक्स में फेंकने वाली कोई भी "शुद्ध" त्रुटियां नहीं दिखाई देती हैं, यह ऐप्पल द्वारा प्रदान की गई विधि का उपयोग करके केवल एक उदाहरण था। क्या आप मुझे "शुद्ध" स्विफ्ट त्रुटि के डॉक्स में एक उदाहरण प्रदान कर सकते हैं? इसके अतिरिक्त, ['त्रुटि प्रकार 'को' NSError' द्वारा अपनाया गया है।] (Https://developer.apple.com/library/ios/documentation/Swift/Reference/Swift_ErrorType_Protocol/index.html) – JAL

+0

किसी भी तरह से, अलग नहीं हैं त्रुटियों के प्रकार फेंक रहे हैं। सभी त्रुटियां 'NSError' प्रकार या' ErrorType' प्रोटोकॉल के अनुरूप होंगी। क्या गलत हुआ यह जानने के लिए आपको त्रुटि के विशिष्ट वर्णन या त्रुटि कोड को देखना होगा। – JAL

-1

आप यह इंगित करने के लिए एक पैटर्न लिखते हैं कि खंड में कौन सी त्रुटियां हैंडल कर सकती हैं।

do { 
    try expression 
    statements 
} catch pattern 1 { 
    statements 
} catch pattern 2 where condition { 
    statements 
} 

देखें अनुभाग हैंडलिंग त्रुटियाँ Swift Programming Language

+4

प्रश्न यह है कि मैं फ़ंक्शन द्वारा फेंकने वाली सभी संभावित त्रुटियों की सूची कैसे प्राप्त कर सकता हूं। अगर मुझे सूची नहीं पता है, तो मैं निर्दिष्ट नहीं कर सकता कि मुझे कौन सा पता है कि कैसे निपटना है। – IgnazioC

0

मेरे पास ओपी के समान प्रश्न था। चूंकि किसी ने वास्तव में प्रश्न का उत्तर नहीं दिया क्योंकि उसने पूछा (और मैं भी), यहां मेरा योगदान दिया गया है।

स्विफ्ट 3 और एक्सकोड 8.3.3 में आप व्यक्तिगत अपवादों का इलाज करने के लिए निम्नानुसार करेंगे। नीचे मैं आपको FileManager के साथ एक उदाहरण दूंगा।

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

मेरे उदाहरण में नीचे, फ़ाइल संबंधित त्रुटियों NSCocoaErrorDomain में फेंक दिया जाता है और इन त्रुटियों कोड परिभाषित कर रहे हैं/फाउंडेशन/FoundationErrors.h में सूचीबद्ध।अपने कंप्यूटर में, वे

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/FoundationErrors.h 
MacOS क्षुधा के लिए

पर स्थित है और

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework/Headers/ 
iPhone क्षुधा के लिए

पर कर रहे हैं।

let home = FileManager.default.homeDirectoryForCurrentUser 
let file = home.appendingPathComponent("file") 
do { 
    let loadedString = try String(contentsOf: file) 
} 
catch { 
    let realError = error as NSError // As weird as it looks, Xcode actually wants this forced conversion 
    print(realError.localizedDescription) 
    switch realError.code { 
    case 257: // No permission 
     handleNoPermission() 
    case 260: // File not found 
     handleFileNotFound() 
    default: 
     handleUndefinedError() 
    } 
} 

.localizedDescription अपने उपयोगकर्ता की भाषा है कि त्रुटि के बारे में में एक उपयोगकर्ता के अनुकूल संदेश है:

तो यहाँ एक उदाहरण है। अगर फ़ाइल ऊपर नहीं मिली है तो यह प्रिंट करता है: The file “file” couldn’t be opened because there is no such file. अंग्रेजी में। इसका उपयोग सीधे आपके उपयोगकर्ता को मौजूद त्रुटि संवादों में किया जाना है।

तुम भी क्या त्रुटि प्रत्येक डोमेन यहाँ से फेंक दिया जाता है के बारे में अधिक जानकारी प्राप्त कर सकते हैं: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorObjectsDomains/ErrorObjectsDomains.html

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