enum MyError:Error {
case errorA
case errorB
//实现Error协议
var errorDescription:String{
if self == .errorA{
return "errorA"
}else{
return "errorB"
}
}
}
print(MyError.errorA.errorDescription) //errorA
throws
关键字throws
关键字的函数被称作throwing 函数
throws
关键词需要写在箭头(->)
的前面enum MyError:Error {
case errorA
case errorB
//实现Error协议
var errorDescription:String{
if self == .errorA{
return "errorA"
}else{
return "errorB"
}
}
}
func showError(value:Int) throws -> Int {
if value == 0{
throw MyError.errorA
}else if value == 1{
throw MyError.errorB
}
return value
}
// 对于任一可能会抛出错误的函数
// 在调用前面都必须添加try关键字
let ref = try? showError(value: 1)
print(ref as Any) //nil
let ref = try? showError(value: 2)
print(ref as Any) //2
使用do- catch语句通过运行代码块来处理错误。如果do的句子中的代码抛出错误,则将其与catch子句进行匹配,以确定它们中的哪一个可以处理错误
do {
var value = try showError(value: 0)
print(value)
} catch MyError.errorA {
print("errorA") //errorA
} catch {
print("errorC")
}
使用try?
将错误转换为可选值来处理错误
如果在try?
表达式时抛出错误,则表达式的值为nil
let value = try? showError(value: 0)
print(value) //nil
使用try!
来禁止错误传递,这种方式会把错误放在运行时断言中,如果真的抛出错误,将收到运行时错误
error.png
defer
语句将代码的执行延迟到当前的作用域退出之前break
、return
语句、抛出一个错误
defer
语句中的代码最后才执行,第二条defer
语句中的代码倒数第二个执行,以此类推。最后一条语句会第一个执行defer
语句var lockState = false
func room() -> Bool{
lockState = true
print(lockState)
defer {
lockState = false
}
return lockState
}
print(lockState) //false
self.room() //true
print(lockState) //false