Swift3.0 - 異常錯(cuò)誤

Swift3.0 - 真的很簡(jiǎn)單
Swift3.0 - 數(shù)據(jù)類(lèi)型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可選值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 對(duì)象和類(lèi)
Swift3.0 - 屬性
Swift3.0 - 函數(shù)和閉包
Swift3.0 - 初始化和釋放
Swift3.0 - 協(xié)議protocol
Swift3.0 - 類(lèi)和結(jié)構(gòu)體的區(qū)別
Swift3.0 - 枚舉
Swift3.0 - 擴(kuò)展
Swift3.0 - 下標(biāo)
Swift3.0 - 泛型
Swift3.0 - 異常錯(cuò)誤
Swift3.0 - 斷言
Swift3.0 - 自動(dòng)引用計(jì)數(shù)(strong,weak,unowned)
Swift3.0 - 檢測(cè)API
Swift3.0 - 對(duì)象的標(biāo)識(shí)
Swift3.0 - 注釋
Swift3.0 - 元類(lèi)型
Swift3.0 - 空間命名
Swift3.0 - 對(duì)象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 類(lèi)簇
Swift3.0 - 動(dòng)態(tài)調(diào)用對(duì)象(實(shí)例)方法
Swift3.0 - 文本輸出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 鏡像
Swift3.0 - 遇到的坑

  • 定義異常枚舉類(lèi)型
enum OSUserLoginError :Error{
      case AllNoComplete
      case UserNameEmpty
      case PasswordEmpty
  }

提示:

注意異常枚舉類(lèi)型必須遵守Error 協(xié)議

Error 是協(xié)議
  • 可以輸出錯(cuò)誤值的枚舉定義
    需求:

錄入學(xué)生成績(jī),如果輸入的成績(jī)不在0...100 拋出異常

// 定義錯(cuò)誤協(xié)議
enum ScoreInputError:Error{
    case lowZero(name:String,score:Float)
    case highHundred(name:String,score:Float)
}
// 定義含有異常機(jī)制的函數(shù)
func inputStudentName(name:String,score:Float)throws ->Bool{
    if score < 0{
        throw ScoreInputError.lowZero(name: name, score: score)
    }else if score > 100{
        throw ScoreInputError.highHundred(name: name, score: score)
    }
    // 開(kāi)始錄入
    // 錄入結(jié)束
    return true
}
// 調(diào)用函數(shù)
do {
   let result =  try inputStudentName(name: "張丹", score:300)
}catch ScoreInputError.lowZero(let name,let score){
    print("異常:\(name)的成績(jī)?yōu)閈(score) --小于0")
}catch ScoreInputError.highHundred(let name,var score){
    print("異常:\(name)的成績(jī)?yōu)閈(score) -- 大于1000")
}

運(yùn)行結(jié)果:

異常:張丹的成績(jī)?yōu)?00.0 -- 大于1000

  • 處理不同類(lèi)型的異常
    需求:

用戶輸入的密碼或者用戶名為空拋出異常,如果是密碼為空,輸入密碼為空的用戶

 // 定義異常 
 enum OSUserLoginError :Error{
    case AllNoComplete
    case UserNameEmpty
    case PasswordEmpty(userName:String)
}
// 定義含有異常機(jī)制的函數(shù)
func verifyUserName(userName:String,password:String)throws -> Bool{
if userName == "" && password == "" {
    throw OSUserLoginError.AllNoComplete
}else if (userName == "" && password != ""){
    throw OSUserLoginError.UserNameEmpty
}else if (userName != "" && password == ""){
    throw OSUserLoginError.PasswordEmpty(userName: userName)
}
    return true
}
// 使用含有異常的函數(shù)
do
{
    try  verifyUserName(userName: "酷走天涯", password: "")
}catch OSUserLoginError.PasswordEmpty(let userName){
    print("用戶:" + userName + "輸入的密碼為空")
} catch OSUserLoginError.UserNameEmpty{
    print("用戶名為空")
} catch{
    print(error)
}

運(yùn)行結(jié)果:

用戶:酷走天涯輸入的密碼為空

  • where 在錯(cuò)誤類(lèi)型的使用
 enum ErrorType:Error {
    case success
    case error(code:Int)
}


func inputScore(score:Int) throws->Bool{

    if score < 0{
        throw ErrorType.error(code: 0)
    }else if score > 100 {
        throw ErrorType.error(code: 1)
    }
    return true
}

do {
  let score =  try inputScore(score: -2)
}catch ErrorType.error(let x) where x == 0{ // 可以做判斷錯(cuò)誤類(lèi)型

}catch{
    print(error)
}
  • defer 的延時(shí)作用
    需求:我們定義一個(gè)用戶對(duì)象,包含姓名和用戶圖像數(shù)據(jù)流
 // 定義錯(cuò)誤協(xié)議
  enum StudentError:Error{
    case NameEmpty
    case ScoreLowZero
  }
  // 定義學(xué)生類(lèi)
  class Student{
    var name:String = "123"
    var score:Float = 0
    var userIcon:UnsafeMutableRawPointer = malloc(40*40*4) // 定義用戶圖像數(shù)據(jù)流
    init(name:String)throws{
        if name == ""{
        defer{
            free(self.userIcon)
            print("第2步發(fā)生異常清理內(nèi)存")
       }
        print("第1步 拋出異常")
        throw StudentError.NameEmpty
        }
    self.name = name
  }
  }
  // 調(diào)用函數(shù)
  do{
      let student = try Student(name: "")
  }catch {
    print(error)
  }

運(yùn)行結(jié)果:

第1步 拋出異常
第2步發(fā)生異常清理內(nèi)存
NameEmpty

注意

1.類(lèi)中使用defer,在對(duì)象方法中,使用defer,在defer塊中,調(diào)用屬性之前,必須初始化所有存儲(chǔ)屬性,重要事說(shuō)三遍,所有的存儲(chǔ)屬性,所有的,存儲(chǔ)屬性
2.defer 在定義的當(dāng)前作用域最后一步執(zhí)行

  • try 、try!藐石、try? 的用法

A.try

 let student = try Student(name: "")
 print("運(yùn)行結(jié)果\(student)")

運(yùn)行結(jié)果:

第1步
第2步發(fā)生異常清理內(nèi)存

結(jié)論:

我們發(fā)現(xiàn)print("運(yùn)行結(jié)果(student)") 這句代碼沒(méi)有執(zhí)行,說(shuō)明發(fā)生了異常,后面的代碼不會(huì)執(zhí)行,但沒(méi)有報(bào)錯(cuò)提示

B.try!

 let student = try! Student(name: "")
 print("運(yùn)行結(jié)果\(student)")

運(yùn)行結(jié)果:

第1步
第2步發(fā)生異常清理內(nèi)存
fatal error: 'try!' expression unexpectedly raised an error: StudentError.NameEmpty: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-800.0.46.2/src/swift/stdlib/public/core/ErrorType.swift, line 178

結(jié)論:

一旦發(fā)生異常,系統(tǒng)會(huì)報(bào)錯(cuò),后面的代碼不再繼續(xù)執(zhí)行

C.try?

 let student = try? Student(name: "")
 print("運(yùn)行結(jié)果\(student)")

運(yùn)行結(jié)果:

第1步
第2步發(fā)生異常清理內(nèi)存
運(yùn)行結(jié)果nil

 let student = try? Student(name: "234")
 print("運(yùn)行結(jié)果\(student)")

運(yùn)行結(jié)果:

運(yùn)行結(jié)果Optional(Student)

結(jié)論:

try? 如果發(fā)生異常則返回nil,如果沒(méi)有發(fā)生異常,則返回可選值,我們?cè)谑褂脮r(shí),需要解包可選值!

應(yīng)用1:

public enum OSNetError:Error{
    /// 錯(cuò)誤類(lèi)型枚舉值
    case requestError(RequestError)
    case responseError(ResponseError)


    /// 請(qǐng)求錯(cuò)誤異常
    public  enum RequestError{
      case invalidUrl(url:URL)
      case parameterException
    }

    /// 響應(yīng)錯(cuò)誤異常
   public  enum ResponseError:Int{
    case dataFileNil
    case missingContentType
    case unacceptableStatusCode
    case dataFileReadFailed
  }

}

請(qǐng)求:

 func requestUrl(url:URL)throws{
    if !url.absoluteString.contains("http"){
        throw OSNetError.requestError(.invalidUrl(url:url))
    }
}

應(yīng)用2: 如果你要使用的值有可能為nil,你最好的寫(xiě)法應(yīng)該像下面這樣

guard let filter = CIFilter(name: "CIGaussianBlur",
        withInputParameters: parameters) else { fatalError() }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旱爆,一起剝皮案震驚了整個(gè)濱河市店乐,隨后出現(xiàn)的幾起案子赶舆,更是在濱河造成了極大的恐慌堡掏,老刑警劉巖腾窝,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浴鸿,死亡現(xiàn)場(chǎng)離奇詭異岂却,居然都是意外死亡忿薇,警方通過(guò)查閱死者的電腦和手機(jī)躏哩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)署浩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人扫尺,你說(shuō)我怎么就攤上這事筋栋。” “怎么了正驻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵弊攘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我姑曙,道長(zhǎng)襟交,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任伤靠,我火速辦了婚禮捣域,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宴合。我一直安慰自己焕梅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布形纺。 她就那樣靜靜地躺著丘侠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逐样。 梳的紋絲不亂的頭發(fā)上蜗字,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音脂新,去河邊找鬼挪捕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛争便,可吹牛的內(nèi)容都是我干的级零。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奏纪!你這毒婦竟也來(lái)了鉴嗤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤序调,失蹤者是張志新(化名)和其女友劉穎醉锅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體发绢,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡硬耍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了边酒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片经柴。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖墩朦,靈堂內(nèi)的尸體忽然破棺而出坯认,到底是詐尸還是另有隱情,我是刑警寧澤介杆,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布鹃操,位于F島的核電站,受9級(jí)特大地震影響春哨,放射性物質(zhì)發(fā)生泄漏荆隘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一赴背、第九天 我趴在偏房一處隱蔽的房頂上張望椰拒。 院中可真熱鬧,春花似錦凰荚、人聲如沸燃观。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缆毁。三九已至,卻和暖如春到涂,著一層夾襖步出監(jiān)牢的瞬間脊框,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工践啄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浇雹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓屿讽,卻偏偏與公主長(zhǎng)得像昭灵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法烂完,類(lèi)相關(guān)的語(yǔ)法试疙,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法窜护,異常的語(yǔ)法效斑,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,659評(píng)論 18 399
  • 因?yàn)橐Y(jié)局swift3.0中引用snapKit的問(wèn)題,看到一篇介紹Xcode8,swift3變化的文章,覺(jué)得很詳細(xì)...
    uniapp閱讀 4,422評(píng)論 0 12
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理非春,服務(wù)發(fā)現(xiàn)柱徙,斷路器,智...
    卡卡羅2017閱讀 134,693評(píng)論 18 139
  • 四月的夏天沒(méi)可能只有三十六度 我爬上菠蘿蜜的大樹(shù) 啃著西瓜奇昙,想要砸下一個(gè)大椰子 知了知了沒(méi)有叫個(gè)不停 我卻聞到了了...
    知知知知鳥(niǎo)閱讀 750評(píng)論 0 1
  • 我喜歡把亂七八糟的一大堆圖片加上亂七八糟一大堆濾鏡护侮,就這樣胡亂地疊加,總結(jié)一個(gè)字就是“亂”储耐。 因?yàn)槲?..
    WillWongw閱讀 252評(píng)論 0 0