Swift 错误处理
主要内容:
一.Swift 2.0之前的错误处理 错误处理是应用中响应错误与从错误中恢复的过程。在Swift 2.0之前,错误报告与Objective-C的模式相同,但是Swift可以使用可选类型的返回值,返回 最简单的错误处理,函数的返回值会表明函数执行是否成功:返回值可以是布尔值 var str = "Hello World"
var error: NSError
var results = str.writeToFile(path,atomically: true,encoding:NSUTF8StringEncoding,error: &error)
if results {
//
} else {
println("Error writing filer: (error)")
}
尽管可以以这种方式处理错误,能够调整来满足大多数的需求,但是它一定不是最好的方案。这种方案有一些问题,最大的问题是开发者容易忽略函数返回值和错误自身。大多数有经验的开发者对于检查错误很小心,但是初学者很难理解,特别是函数没有包含 除了使用 尽管使用 二.Swift 2中的错误处理 《一.表示错误 在理解Swift中错误处理的工作原理前,必须要明白如何表示错误。在Swift中,错误是由遵守 我们来看一下如何使用枚举来表示错误,首先,定义一个名字为 enum MyError: ErrorType {
case Minor
case Bad
case Terrible
}
在这个例子中,定义了遵守 enum MyError: ErrorType {
case Minor
case Bad
case Terrible (description: String)
}
三.捕获错误 当函数抛出错误时,我们需要在调用该函数的代码中捕获它。使用 do {
try 调用会抛出错误的函数
...
} catch [pattern] {
...
}
如果错误被抛出,它会一直往外传递,直到被 import Cocoa
let maxNumber = 100
let minNumber = 8
enum PlayerNumberError: ErrorType {
case NumberTooHigh(description: String)
case NumberTooLow(description: String)
case NumberAlreadyAssigned
case NumberDoesNotExist
}
typealias BaseballPlayer = (firstName: String,lastName: String,number: Int)
struct BaseballTeam {
var players: [Int: BaseballPlayer] = [ : ]
mutating func addPlayer(player: BaseballPlayer) throws {
guard player.number < maxNumber else {
throw PlayerNumberError.NumberTooHigh(description: "Max number is (maxNumber)")
}
guard player.number > minNumber else {
throw PlayerNumberError.NumberTooLow(description: "Min number is (minNumber)")
}
guard players[player.number] == nil else {
throw PlayerNumberError.NumberAlreadyAssigned
}
players[player.number] = player
}
func getPlayerByNumber(number: Int) throws -> BaseballPlayer {
if let player = players[number] {
return player
} else {
throw PlayerNumberError.NumberDoesNotExist
}
}
}
var myTeam = BaseballTeam(players: [ : ])
do {
let player = try myTeam.getPlayerByNumber(8)
print("Player is (player.firstName) (player.lastName)")
} catch PlayerNumberError.NumberDoesNotExist {
print("No player has that number")
}
上述例子中, 在 do { } catch { }
do { } catch _ { }
如果想要获取错误,可以使用 do {
} catch let error {
}
使用 do {
try myTeam.addPlayer(("David","Ortiz",10))
} catch PlayerNumberError.NumberTooHigh(let description) {
print("Error: (description)")
} catch PlayerNumberError.NumberTooLow(let description) {
print("Error: (description)")
} catch PlayerNumberError.NumberAlreadyAssigned {
print("Error: Number already assigned")
}
我们也可以让错误传递出去,而不是立即捕获它们。为了实现这样的目的,只需要在函数定义中添加 func myFunc() throws {
try myTeam.addPlayer(("David",34))
}
如果我们确定错误不会被抛出,可以使用强制try(
因为 if let player = try? myTeam.getPlayerByNumber(34) {
print("Player is (player.firstName)")
}
如果需要执行一些清理工作,而不管是否有一些错误,可以使用 func deferFunction() {
print("Function started")
var str: String?
defer {
print("In defer block")
if let s = str {
print("str is (s)")
}
}
str = "John"
print("Function finished")
}
如果调用这个函数,打印到控制台的第一行是 Function started
Function finished
In defer block
str is John
|
- 依赖、依赖倒转原则、IoC/依赖注入、以及在Spring中的实现
- xml – Ellipsize不工作在自定义listView内的textView
- Referenced file contains errors(....)for more informati
- 正则表达式测试网站推荐
- 通达OA 开发基于AJAX技术数据列表控件的智能表单(图文)
- Oracle 12cR2发布,金融行业准备大规模上了
- 第66章、使用SQLite本地数据库(从零开始学Android)
- c# – 为什么在我的代码通过Wait命令之前,此任务未完成
- cocos2dx-lua 之 ProgressTimer 条形进度条 简单血条的实现
- swift – 运算符’ – ‘与两个Uint的模糊使用