1.自定义错误
一般使用枚举自定义错误码。
例子:
enum SomeError:Error {
case A(String)
case B(Int,Int)
}2.do -catch
- 函数内部可以通过throw抛出异常,可能抛出的函数必须加上throws声明。
- 调用函数需要用try调用可能抛出的异常。
- 使用do-catch来捕捉错误。
- 如果这一层不捕捉,可以在当前函数加上throws声明,让错误抛给上一层函数。
- 如果最顶层没有捕捉错误,程序将会结束。
例子:
func chufa(num1: Int,num2: Int) throws -> Int {
if num2 == 0 {
throw SomeError.A("0不能作为除数")
}
return num1 / num2
}
do {
let reslut = try chufa(num1: 20, num2: 0)
print("result:\(reslut)")
}catch let error {
switch error {
case let SomeError.A(msg):
print(msg)
default:
print("其他错误")
}
}3.try?,try!
我们可以使用try?或者try!来调用可能抛出Error的函数,这样就不用处理Error。
例子:
let ret = try? chufa(num1: 20, num2: 0)
let ret2 = try! chufa(num1: 20, num2: 10)4.rethrows
函数本身不会抛出错误,但是调用闭包参数抛出错误,则需要声明rethrows,它会把错误往上面抛。
例子:
func exec(_ fn: (Int,Int) throws -> Int,_ num1: Int, _ num2: Int) rethrows {
print(try fn(num1, num2))
}
try exec(chufa, 20, 10)
5.defer
defer语句,用来定义以任何方式(错误,return)离开代码前必须要执行的代码,在作用域结束前会执行一次。
例子:
func openFile(_ file: String) {
print(1)
}
func closeFile(_ file: String) {
print(2)
}
func test(file: String) throws {
openFile(file)
defer {
closeFile(file)
}
try chufa(num1: 20, num2: 0)
}
try? test(file: "abc")6.assert(断句)
很多编程语言都有断言机制,不符合条件就可以抛出运行错误。常用于调试的时候判断。
例子:
func chufa(num1: Int,num2: Int) throws -> Int {
assert(num2 != 0, "0不能作为除数,真的")
return num1 / num2
}7.fatalError
使用fatalError,可以直接在程序运行时,直接抛出异常,并不能捕捉。
例子:
func test2 () {
fatalError("就是不能进来")
}
test2()8.局部作用域
可以使用do来使用局部作用域。
例子:
do {
print("局部作用域")
}