现在,使用Swift时,某些函数都标有throws,这迫使开发人员在do - try catch块内调用该函数。但是开发人员如何才能知道该函数抛出的不同异常列表?
throws
do - try catch
作为参考,这是一行Java代码:
static void employeeAge(int age) throws MyExceptionA,MyExceptionB
很明显,例外是2 MyExceptionA,MyExceptionB开发人员可以根据错误决定采取不同的操作。
MyExceptionA
MyExceptionB
我们可以在Swift上实现相同的目标吗?
当Swift文档说一个函数时throws,它们意味着它抛出一个ErrorType(在Cocoa API中通常为NSError),而不是异常。
ErrorType
NSError
考虑以下do-try- catch流量NSFileManager的createDirectoryAtPath:
do-try- catch
NSFileManager
createDirectoryAtPath
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将失败,因为documents目录已经存在。日志记录dynamicType的的error显示,它实际上是一个NSError对象:
dynamicType
error
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
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”}}
为了查看函数可以throw遇到的不同类型的错误,您必须检查的error信息,以确定抛出的错误的类型以及如何处理每个错误。在这种情况下,NSError将是其域,代码和描述。
throw
在这种特殊情况下,该路径上已经存在一个目录,因此文件管理器无法创建新目录。该操作可能失败的另一个原因的一个例子是,如果文件管理器没有写访问权限。那将是错误代码256。