// 錯(cuò)誤和異常處理
// 一些在開發(fā)階段的錯(cuò)誤,比如 向一個(gè)無法響應(yīng)某個(gè)消息的 NSObject對(duì)象發(fā)送了消息骑篙,會(huì)得到 NSInvalidArgumentException的異常,或者數(shù)組越界會(huì)得到 NSRangeException恕齐。
// 在 OC 中的 NSError 往往是app開發(fā)中那些'合理的', 比如巍虫, 網(wǎng)絡(luò)回調(diào)用戶密碼不匹配,讀取已經(jīng)被移除的文件生成 NSData 時(shí)
if let url = Bundle.main.url(forResource: "main.json", withExtension: nil) {? ??
let data = NSData(contentsOf: url)? ? ? ?
?let docDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]? ? ? ?
?let jsonPath = docDir.appending("/main.json")? ? ? ??
_ = data?.write(toFile: jsonPath, atomically: true)
}
// 在使用這個(gè)方法的時(shí)候棱烂,要么調(diào)用這個(gè)方法的時(shí)候,前面加入 try?, 要么 使用 do catch
// open func write(to url: URL, options writeOptionsMask: NSData.WritingOptions = []) throws
let data = NSData()
do {? ?
?try data.write(toFile: "hello", options: [])
}
?catch let error as NSError { ??
print("Error:\(error.domain)")
}
// 這類異常是可以捕獲阶女,并判斷的
enum LoginError: Error {? ??
case UserNotFound, UserPasswordNotMatch
}
// 賬號(hào)密碼存儲(chǔ)的字典
let users = [String: String]()
func login(user: String, password: String) throws {? ??
if !users.keys.contains(user) {? ? ? ??
throw LoginError.UserNotFound? ??
}? ? ? ?
?if users[user] != password {? ? ? ??
throw LoginError.UserPasswordNotMatch? ??
}? ? ? ?
?print("Login successfully")}
// 這樣 ErrorType 可以非常明確的指出問題所在颊糜。
?do {? ??
try login(user: "abc", password: "123")
}
?catch LoginError.UserNotFound {? ??
print("UserNotFound")
}
?catch LoginError.UserPasswordNotMatch {? ?
?print("UserPasswordNotMatch")
}
// 這種寫法和 JAVA C# 不同哩治, 他們是 try catch// 和枚舉進(jìn)行關(guān)聯(lián)enum Result {? ? case Success(String)? // 可是使用泛型? Successcase Error(NSError)
}
func doSomethinagParam(param: AnyObject) -> Result {
let success : Bool
// ...
success = true
if success {
return Result.Success("成功完成")
} else {
let error = NSError(domain: "eooroDomain", code: 1, userInfo: nil)
return Result.Error(error)
}
}
// 使用的時(shí)候
let param = "dddd"
let result = doSomethinagParam(param: param as AnyObject)
switch result {
case let .Success(ok):
let serverResponse = ok
case let .Error(error):
let serverResponse = error.description
}
// 使用 try? func(throws) 表明是忽視了 error 并且在 error產(chǎn)生的時(shí)候得到一個(gè) nil? 例如
enum E: Error {
case Negative
}
func methodThrowsWhenPassingNegative(number: Int) throws -> Int{
if number < 0 {
throw E.Negative
}
return number
}
if let num7 = try? methodThrowsWhenPassingNegative(number: 100) {
print(num7)? ? ? ? ? ? ? ? // 100
print(type(of: num7))? ? ? // Int
}
// 在一個(gè) throws 的方法里,不要返回一個(gè) optional 值