Just My Life & My Work

[Swift] try / throw / catch

Swift 在處理例外的時候有很好用的語法,就是 try / throw / catch,可以多加利用,寫出沒有錯誤且崩潰的應用。

  • try 嘗試行為
  • throw 丟出例外
  • catch 抓住例外

我們直接寫個範例,就能知道如何使用~

接著繼續閱讀全文~😌

我們來簡單寫程式碼定義:

// 例外列舉
enum ShoppingCartError: Error {
    case cartIsFull
    case emptyCart
}

// 項目結構
struct Item {
    var price:Double
    var name:String
}

// 輕型購物車類別
class LiteShoppingCart {
    var items:[Item] = []
    func addItem(item:Item) throws {
        guard items.count < 5 else {
            throw ShoppingCartError.cartIsFull
        }
        items.append(item)
    }
    func checkout() throws {
        guard items.count > 0 else {
            throw ShoppingCartError.emptyCart
        }
        // 繼續結帳
    }
}

接著嘗試將項目加入購物車,可能的狀況有:

  1. 購物車為空
  2. 購物車裡項目數為 1- 5 個
  3. 購物車裡項目數為超過 6 個

1 和 3 的狀況會丟出例外,我們直接在 Playground 玩玩看吧~

let shoppingCart = LiteShoppingCart()

do {
    // 加入項目
    try shoppingCart.addItem(item: Item(price: 10, name: "Toy"))
    try shoppingCart.addItem(item: Item(price: 20, name: "Toy2"))
    try shoppingCart.addItem(item: Item(price: 30, name: "Toy3"))
    try shoppingCart.addItem(item: Item(price: 40, name: "Toy4"))
    try shoppingCart.addItem(item: Item(price: 50, name: "Toy5"))
    print("Successfully added 5 items!")
    try shoppingCart.addItem(item: Item(price: 100, name: "Toy6"))

    // 進行結帳
    try shoppingCart.checkout()
    print("Successfully checked out the items!")
} catch ShoppingCartError.cartIsFull {
    print("Couldn't add new items because the cart is full")
} catch ShoppingCartError.emptyCart {
    print("The shopping cart is empty!")
} catch {
    print(error)
}

試著直接執行,得到例外的結果:

Successfully added 5 items!

Couldn’t add new items because the cart is full

接著嘗試把所有項目都註解掉,得到例外的結果:

The shopping cart is empty!

再來僅加入一個項目,此就正常的結果:

Successfully checked out the items!

值得留意的是,在 do 執行動作中,一旦發生 throw 例外,其下面的程式碼就不會被執行呢~

以上是不是很有趣呢?以後寫程式前先仔細思考,會有哪些可能的狀況,然後處理所有狀況,就能避免非預期的錯誤囉~😊

參考:iOS 13 App 程式設計實戰心法。

隨意留個言吧:)~

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

標籤雲

%d 位部落客按了讚: