一、错误处理
1.1-错误类型
1.2-自定义错误
enum SomeError : Error {
case illegalArg(String)
case outOfBounds(Int, Int)
case outOfMemory
}
func divide(_ num1: Int, _ num2: Int) throws -> Int {
if num2 == 0 {
throw SomeError.illegalArg("0不能作为除数")
}
return num1 / num2
}
var result = try divide(20, 10)
var result = try divide(20, 0)
test[5475:220076] Fatal error: Error raised at top level: test.SomeError.illegalArg("0不能作为除数")
1.3-do catch
print("1")
do {
print("2")
print(try divide(20, 0))
print("3")
} catch let SomeError.illegalArg(msg) {
print("参数异常:", msg)
} catch let SomeError.outOfBounds(size, index) {
print("下标越界:", "size=\(size)", "index=\(index)")
} catch SomeError.outOfMemory {
print("内存溢出") }
catch {
print("其他错误") }
print("4")
do {
try divide(20, 0)
} catch let error {
switch error {
case let SomeError.illegalArg(msg): print("参数错误:", msg)
default: print("其他错误")
}
}
参数错误: 0不能作为除数
1.4-处理Error
func test() throws {
print("1")
print(try divide(20, 0))
print("2") }
try test()
func test() throws {
print("1")
do {
print("2")
print(try divide(20, 0))
print("3")
} catch let error as SomeError {
print(error)
}
print("4")
}
try test()
1
2
illegalArg("0不能作为除数")
4
do {
print(try divide(20, 0))
} catch is SomeError{
print("SomeError")
}
SomeError
1.5-try?try!
func test() {
print("1")
var result1 = try? divide(20, 10)
var result2 = try? divide(20, 0)
var result3 = try! divide(20, 10)
print("2")
}
test()
1
2
1.6-rethrows申明
func exec(_ fn: (Int, Int) throws -> Int, _ num1: Int, _ num2: Int) rethrows {
print(try fn(num1, num2))
}
try exec(divide, 20, 0)
Fatal error: Error raised at top level:
1.7-defer(finally)
func open(_ filename: String) -> Int {
print("open")
return 0
}
func close(_ file: Int) {
print("close")
}
func processFile(_ filename: String) throws {
let file = open(filename)
defer {
close(file)
}
try divide(20, 0)
}
try processFile("test.txt")
open
close
Fatal error: Error raised at top level:
func fn1() { print("fn1") }
func fn2() { print("fn2") }
func test() {
defer { fn1() }
defer { fn2() }
}
test()
fn2
fn1
1.8-assert断言
func divide(_ v1: Int, _ v2: Int) -> Int {
assert(v2 != 0, "除数不能为0")
return v1 / v2
}
print(divide(20, 0))
1.9-fatalError
func test(_ num: Int) -> Int {
if num >= 0 {
return 1
}
fatalError("num不能小于0")
}
class Person { required init() {} }
class Student : Person {
required init() { fatalError("don't call Student.init") }
init(score: Int) {}
}
var stu1 = Student(score: 98)
var stu2 = Student()
Fatal error: don't call Student.init: file
1.10-局部作用域
class Dog{
var age:Int=0
func run(){
print("dog run.")
}
init(){}
}
do {
let dog1 = Dog()
dog1.age = 10
dog1.run()
}
do {
let dog2 = Dog()
dog2.age = 10
dog2.run()
}
print(1)
dog run.
dog run.
1