Swift 中 throws 異常丟擲

清雨未盡時發表於2018-05-23

一.異常丟擲關鍵 throws 定義在函式結尾 如果函式有返回值 定義在 返回型別前如 :

func throwDeliver(num:Int) throws ->String


二.定義方法

//錯誤傳遞
    @discardableResult
    func throwDeliver(num:Int) throws ->String {
        print("錯誤傳遞")
        try numberTest(num: num)
        print("未傳遞錯誤")
        return "無錯誤"
    }
    func numberTest(num:Int) throws{
        if num == 1 {
            print("成功")
        }else if num == 2 {
            throw OperationError.ErrorTwo
        }else if num == 3{
            throw OperationError.ErrorThree("失敗")
        }else {
            throw OperationError.ErrorOther
        }

    }


三、使用

1. 禁止異常傳遞,只有當你確定這個語句不會丟擲異常你才可以這麼做否則會引發執行時錯誤

print(try? throwDeliver(num: 1)+":禁止錯誤傳遞")

錯誤傳遞
成功
未傳遞錯誤
Optional("無錯誤:禁止錯誤傳遞")

print(try? throwDeliver(num: 5)+":禁止錯誤傳遞")

錯誤傳遞
nil

在執行到

print("錯誤傳遞")

try numberTest(num: num) 丟擲異常 後續程式碼不在走下去

2.將異常轉換成可選值,如果一個語句會丟擲異常那麼它將返回nil無論這個語句本來的返回值是什麼:

 if let retureMessage = try? throwDeliver(num: 1) {
            print("可選值非空:"+retureMessage)

        }


錯誤傳遞
成功
未傳遞錯誤
可選值非空:無錯誤 

if let retureMessage = try? throwDeliver(num: 5) {
            print("可選值非空:"+retureMessage)

        }


錯誤傳遞 


3.使用do-catch捕獲處理異常,在do閉包裡面執行會丟擲異常的程式碼,在catch 分支裡面匹配異常處理異常

  do {
            print("do-catch 錯誤捕獲")
            try throwDeliver(num: 1)
            print("未捕獲錯誤")
        } catch  OperationError.ErrorOne {
            print("ErrorOne:")
        } catch OperationError.ErrorTwo {
            print("ErrorTwo:")
        } catch OperationError.ErrorThree(let discription) {
            print("ErrorThree:"+discription)
        }catch let discription{
            print(discription)
        }


do-catch 錯誤捕獲
錯誤傳遞
成功
未傳遞錯誤
未捕獲錯誤

do {
            print("do-catch 錯誤捕獲")
            try throwDeliver(num: 5)
            print("未捕獲錯誤")
        } catch  OperationError.ErrorOne {
            print("ErrorOne:")
        } catch OperationError.ErrorTwo {
            print("ErrorTwo:")
        } catch OperationError.ErrorThree(let discription) {
            print("ErrorThree:"+discription)
        }catch let discription{
            print(discription)

        }


do-catch 錯誤捕獲
錯誤傳遞
ErrorOther


也可以在 catch 後不加 條件選擇 直接輸出 系統丟擲的錯誤資訊

        do {
            try throwDeliver(num: 3)
            print("未捕獲錯誤")
        } catch
        {
            print(error)

        }


錯誤傳遞
ErrorOther


相關文章