2015-08-13 21 views
15

bunları yakalamak için bir tür hatalar nasıl bulunur Bir dizinde dosya adları dizisi almak için NSFileManager.contentsOfDirectoryAtPath kullanıyorum. Hataları işlemek için yeni do-try-catch sözdizimi kullanmak istiyorum:Bir yöntem atlamak ve Swift

do { 

    let docsArray = try fileManager.contentsOfDirectoryAtPath(docsPath) 

} catch { 

    // handle errors 
    print(error) // this is the best I can currently do 

} 

bir hata docsPath var olmadığını olabileceğini görüntüleme, ancak bu hatayı yakalamak için nasıl bilmiyorum. Ve diğer olası hataların neler olabileceğini bilmiyorum.

Belgeler örneği

Error Handling documentation bu

enum VendingMachineError: ErrorType { 
    case InvalidSelection 
    case InsufficientFunds(centsNeeded: Int) 
    case OutOfStock 
} 

ve

do { 
    try vend(itemNamed: "Candy Bar") 
    // Enjoy delicious snack 
} catch VendingMachineError.InvalidSelection { 
    print("Invalid Selection.") 
} catch VendingMachineError.OutOfStock { 
    print("Out of Stock.") 
} catch VendingMachineError.InsufficientFunds(let amountNeeded) { 
    print("Insufficient funds. Please insert an additional \(amountNeeded) cents.") 
} 

gibi bir örnek var ama ben standardın hatalarını yakalamak için benzer bir şey yapmak nasıl bilmiyorum throws anahtar sözcüğünü kullanarak yöntemleri olan hızlı türler.

NSFileManager class reference for contentsOfDirectoryAtPath, ne tür hataların döndürüleceğini söylemez. Yani onları yakalarsam hangi hataların yakalanacağını veya nasıl ele alınacağını bilmiyorum.

Güncelleme

ben böyle bir şey yapmak istiyorum:

do { 
    let docsArray = try fileManager.contentsOfDirectoryAtPath(docsPath) 
} catch FileManagerError.PathNotFound { 
    print("The path you selected does not exist.") 
} catch FileManagerError.PermissionDenied { 
    print("You do not have permission to access this directory.") 
} catch ErrorType { 
    print("An error occured.") 
} 
+4

Çoğalt? [Bir işlev tarafından atılan hataların listesi nasıl alınır?] (Http: // stackoverflow.com/q/34877027/2415822) – JAL

+0

@JAL, Evet, bu soru benzer. Cevabınızda, “NSError” un nasıl elde edileceğini gösterdiniz, ancak farklı hata türlerini nasıl ayırt edeceğiniz ve ele alacağınız hakkında hiçbir ayrıntı vermediniz. – Suragch

+0

Ayrıca ilgili (yorumlarda tartışmaya bakın): [Xcode'ta Swift ile bir fonksiyonun hangi hataları attığını bulun] (http://stackoverflow.com/q/36139221/2415822) Bir listeyi almanın gerçekten hiçbir yolu yoktur. ErrorType bir işlev tarafından atılır. 'ErrorType', bir enumların uyumlu hale gelmesini sağlayan bir protokoldür (' NSError' 'ErrorType' ile uyumludur ve belirli hataların üstesinden gelmek için döndürülen hata kodunu kontrol etmeniz gerekir). – JAL

cevap

12

NSError otomatik alan tipi olur ErrorType (örneğin NSCocoaErrorDomainNSCocoaError olur) için bağlandığı ve hata kodu değeri döndürülebilir olan hata bilmek için

olarak
import Foundation 

let docsPath = "/file/not/found" 
let fileManager = NSFileManager() 

do { 
    let docsArray = try fileManager.contentsOfDirectoryAtPath(docsPath) 
} catch NSCocoaError.FileReadNoSuchFileError { 
    print("No such file") 
} catch { 
    // other errors 
    print(error) 
} 

(NSFileReadNoSuchFileError.FileReadNoSuchFileError olur) olur belirli arama, sadece dokümantasyon yardımcı olabilir. Hemen hemen tüm Foundation hataları, NSCocoaError etki alanının bir parçasıdır ve FoundationErrors.h içinde bulunabilir (ancak, Foundation'ın bazen NSPOSIXErrorDomain altındaki POSIX hatalarını döndürebileceği bazı nadir hatalar olsa da), ancak bunlar geri alınmak zorunda kalabilmek için tamamen köprülenmemiş olabilir Onları NSError seviyesinde yöneterek.

Daha fazla bilgi bulunabilir « Using Swift with Cocoa and Objective-C (Swift 2.2) »

2
Bu dönecektir

NSError: your'e "güncelleme" bölümünde soran ne

let fileManager = NSFileManager() 

do { 

    let docsArray = try fileManager.contentsOfDirectoryAtPath("/") 

} catch let error as NSError { 

    // handle errors 
    print(error.localizedDescription) 

    // The file “Macintosh HD” couldn’t be opened because you don’t have permission to view it. 
} 
+0

Yani özel sınıflar için Dokümanları Kullanma Hataları'nda olduğu gibi bir enum listesi olmadığını mı söylüyorsunuz? Hatanın ne tür bir açıklama yazdığını yazdırmalıyım ve hata türüne göre bireyselleştirilmiş davranmaya çalışmamalı mıyım? Ya hatayı yazdırmaktan başka bir şey yapmak istersem ne yapmalıyım? – Suragch

+1

Sağ. Bu Obj-C'de gördüğünüzle aynı şeydir ve Obj-C belgelerine bakarsanız, Kakao (Dokunma) çerçevesinin geri kalanıyla oldukça tutarlı olan NSError kullanır. NSError, ErrorType ile uyumlu bir sınıftır. Bir açıklamayı yazdırmaktan daha fazlasını yapabilirsiniz, bkz. Https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSError_Class/index.html. – MirekE

+0

Güncellememde gösterdiğim gibi bir şey yapmanın bir yolu var mı? – Suragch

0

değil mümkün. Atmanın ne yapılacağını veya gösterilemediğini size bildiren atma işlevi kararı, daha sonra genel bir hatayla ilgilenmeniz gerekiyor.

atılan hatalarla ilgili bilgileri açığa do fonksiyonların bir sürü - örneğin:

func startVPNTunnel() throws 
Description 
Start the process of connecting the VPN 
true if the process of connecting the VPN started successfully, false if an error occurred. 
Parameters 
error 
A pointer to a pointer to an NSError object. If specified and the VPN connection process cannot be started due to an error, this parameter will be set to point to an NSError object containing details about the error. See NEVPNManager Class Reference for a list of possible errors. 

Düzenleme: Bunun olası bir nedeni - yani, atma işlevi atar oluyor hataları değiştirebilir ve yol bütün Bu hatayı yakalayan kod hala geçerli olacaktır.

İlgili konular