1.swift在运行时对可恢复错误的抛出、捕获、传递和操作的支持。
2.在swift中,错误用符合ErrorType协议的类型的值来表示:
enum VendingMachineError: ErrorType {
case InvalidSelection//选择无效
case InsufficientFunds(coinsNeeded: Int) //金额不足
case OutOfStock//缺货
}
3.swift中有4种处理错误的方式:
a.把函数抛出的错误传递给调用此函数的代码throwing函数
b.用do-catch语句处理错误do...catch
c.将错误作为可选类型处理try?
d.或者断言此错误根本不会发生try!
为了表示一个函数、方法或构造器可以抛出错误,在函数声明的参数列表之后加上throws关键字。一个标有throws关键字的函数被称作throwing函数。如果这个函数指明了返回值类型,throws关键词需要写在箭头(->)的前面。
方式一:用throwing函数传递错误
func vend(itemNamed name: String) throws{}
func canThrowErrors() throws -> String{}
如果在调用系统某一个方法时,该方法最后有一个throws.说明该方法会抛出异常.如果一个方法会抛出异常,那么需要对该异常进行处理
方式二:try方式程序员手动捕捉异常
do {
try NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)
} catch {
// error异常的对象
print(error)
}
方式三:try?方式(常用方式)系统帮助我们处理异常,如果该方法出现了异常,则该方法返回nil.如果没有异常,则返回对应的对象
guard let anyObject = try? NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) else {
return
}
方式四:try!方法(不建议使用,非常危险)直接告诉系统,该方法没有异常.注意:如果该方法出现了异常,那么程序会报错(崩溃)
let anyObject = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)
4.swift中指定清理操作:
可以使用defer语句在即将离开当前代码块时执行一系列语句。例如,你可以用defer语句来确保文件描述符得以关闭,以及手动分配的内存得以释放。
defer语句将代码的执行延迟到当前的作用域退出之前。延迟执行的操作会按照它们被指定时的顺序的相反顺序执行——也就是说,第一条defer语句中的代码会在第二条defer语句中的代码被执行之后才执行,以此类推。
func processFile(filename: String) throws {
if exists(filename) {
let file = open(filename)
defer {
close(file)
}
while let line = try file.readline() {
//处理文件。
}
// close(file)会在这里被调用,即作用域的最后。
}
}
网友评论