Swift try try! try?使用和區別


Swift try try! try?使用和區別


一、異常處理try catch的使用

1. swift異常處理 歷史由來

  • Swift1.0版本 Cocoa Touch 的 NSError ,Swift並沒有真正的具備自己的異常處理機制
  • Swift2.0版本 加入 ErrorType protocol
  • Swift3.0版本 改名 Error protocol

2. Swift3.0 Error protocol 的使用

首先定義一個枚舉,集成協議Error (Swift 2.0 的協議叫做ErrorType,3.0后協議改名Error)

enum MyError : Error {
    case one
    case two
    case three
}

3. throws和throw的使用

使用throws放在參數列表后面標明一個方法有異常拋出,標准格式 : func 方法名字 (參數列表) throws -> 返回值類型 並在方法內使用throw拋出異常

func testFunc(str: String) throws -> String  {

    if str == "one" {
        throw MyError.one
    }else if str == "two" {
        throw MyError.two
    }else if str == "three" {
        throw MyError.three
    }

    return "ok"
}

4. 使用do-catch處理異常

do {
    var str = try testFunc(str: "three")
} catch MyError.one {
    print("MyError.one")
} catch MyError.two {
    print("MyError.two")
} catch let error as MyError {
    print(error)
}

二、try?的使用

Swift2.0 后加入了新的關鍵字 try? , 如果不想處理異常那么可以用這個關鍵字,使用這個關鍵字返回一個可選值類型,如果有異常出現,返回nil.如果沒有異常,則返回可選值.例子如下

enum MyError : Error {
    case one
    case two
    case three
}

func testFunc(str: String) throws -> String  {

    if str == "one" {
        throw MyError.one
    }else if str == "two" {
        throw MyError.two
    }else if str == "three" {
        throw MyError.three
    }

    return "ok"
}

var str = try? testFunc(str: "three")
print(str)

控制台輸出

nil
Program ended with exit code: 0

三、try!的使用

如果不想處理異常,而且不想讓異常繼續傳播下去,可以使用try!.這有點兒類似NSAssert().但是一旦使用try!后,在可能拋出異常的方法中拋出了異常,那么程序會立刻停止.例子如下

enum MyError : Error {
    case one
    case two
    case three
}

func testFunc(str: String) throws -> String  {

    if str == "one" {
        throw MyError.one
    }else if str == "two" {
        throw MyError.two
    }else if str == "three" {
        throw MyError.three
    }

    return "ok"
}

var str = try! testFunc(str: "three")

控制台:程序奔潰掉~


四、try try? try! 的區別

  • try 出現異常處理異常
  • try? 不處理異常,返回一個可選值類型,出現異常返回nil
  • try! 不讓異常繼續傳播,一旦出現異常程序停止,類似NSAssert()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM