Swift 的 do-try-catch 語法和實現


在 Swift 中,do-try-catch 語句用於處理函式或方法可能丟擲的錯誤。它提供了一種結構化的方式來捕獲和處理程式碼中的錯誤。在你的程式碼庫中,你無法在執行時錯誤出現時處理所有錯誤,但使用 try-catch,你可以處理這些錯誤而不會導致應用程式崩潰。

do-try-catch 語法

do 塊用於包裝可能丟擲錯誤的程式碼。在 do 塊內,你呼叫可能丟擲錯誤的函式或方法。

try 關鍵字用於在呼叫任何可能丟擲錯誤的函式或方法之前。這告訴 Swift 編譯器,以下程式碼可能會丟擲錯誤,應該相應地處理。

如果在 do 塊內丟擲錯誤,程式碼會立即跳轉到 catch 塊。catch 塊提供了一個機會來結構化地處理錯誤。你可以透過使用 catch 關鍵字後跟錯誤型別來捕獲錯誤。你也可以使用泛型 catch 塊來捕獲任何錯誤。

這是一個基本語法的示例

do {
   // code that can throw an error
   try someFunctionThatMayThrowAnError()
} catch {
   // Handle the error here
}

你也可以捕獲特定型別的錯誤

do {
   // code that can throw an error
   try someFunctionThatMayThrowAnError()
} catch CustomError.someError {
   // handle CustomError.someError here
} catch CustomError.anotherError {
   // handle CustomError.anotherError here
} catch {
   // handle any other error
}

Swift do-try-catch 語法的幾個示例

示例 1:從檔案讀取資料

為了讀取給定路徑下檔案的內容,此函式使用 Data(contentsOf:) 初始化器。如果檔案不存在,或者我們沒有訪問許可權,此初始化器可能會引發錯誤。

為了將資料轉換為字串,我們使用初始化器 String(decoding:as:)。如果輸入資料不是有效的 UTF-8 字串,此初始化器可能會引發錯誤。

我們將看到如何處理檔案路徑不正確或檔案不存在的情況下的錯誤。

這是一個示例:

import Foundation
func readFile(atPath path: String) throws -> String {
   let data = try Data(contentsOf: URL(fileURLWithPath: path))
   return String(decoding: data, as: UTF8.self)
}
do {
   let data = try readFile(atPath: "/path/to/file.txt")
   print(data)
} catch {
   print("Error: \(error)")
}

輸出

Error: Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"

在上面的示例中,我們定義了一個名為 readFile() 的函式。此方法接受一個引數,即檔案路徑。此方法可能會丟擲錯誤,如方法簽名中所示。當我們使用檔案路徑呼叫此方法時,我們使用 do-catch 塊呼叫它。如果在檔案讀取過程中發生任何錯誤,則將執行 catch 塊。

示例 2:發出網路請求

在此示例中,我們使用 Data(contentsOf:) 初始化器向指定的 URL 發出網路請求。如果網路連接出現問題或 URL 無效,此初始化器可能會丟擲錯誤。

我們使用 JSONSerialization.jsonObject(with:options:) 方法將響應資料解析為 JSON 物件。如果資料不是有效的 JSON 或選項無效,此方法也可能會丟擲錯誤。

import Foundation
func makeRequest(url: URL) throws -> [String: Any] {
   let data = try Data(contentsOf: url)
   let json = try JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
   return json
}
let url = URL(string: "https://jsonplaceholder.typicode.com/posts/1")!
do {
   let json = try makeRequest(url: url)
   print(json)
} catch {
   print("Error: \(error)")
}

輸出

["userId": 1, "body": quia et suscipit
suscipit recusandae consequuntur expedita et cum
reprehenderit molestiae ut ut quas totam
nostrum rerum est autem sunt rem eveniet architecto, "id": 1, "title": sunt aut facere repellat provident occaecati excepturi optio reprehenderit]

在此示例中,我們構造一個名為 makeRequest(url:) 的函式,它使用 URL 傳送網路請求。如果網路連接出現問題或 URL 錯誤,該函式可能會丟擲錯誤。

為了呼叫此方法並管理任何潛在問題,我們使用 do-try-catch 語法。如果丟擲錯誤,則 catch 塊用於捕獲它並輸出錯誤訊息。如果未引發任何問題,我們將 JSON 響應列印到控制檯。

示例 3:巢狀的 do-try-catch 塊

import Foundation
enum MyError: Error {
   case somethingWentWrong
}
func doSomething() throws {
   throw MyError.somethingWentWrong
}
func doSomethingElse() throws {
   try doSomething()
}
do {
   try doSomethingElse()
} catch MyError.somethingWentWrong {
   print("Oops! Something went wrong in doSomething().")
} catch {
   print("Unknown error: \(error)")
}

輸出

Oops! Something went wrong in doSomething().

在此示例中,我們有兩個方法:doSomething() 和 doSomethingElse()。doSomething() 丟擲型別為 MyError 的錯誤。doSomethingElse() 使用 try 關鍵字呼叫 doSomething(),如果發生任何錯誤。

我們在 do 塊中使用“try”來使用可能出現問題的函式 doSomethingElse()。如果發生錯誤,將執行相關的 catch 塊。在本例中,我們有兩個 catch 塊:一個特定於 MyError.somethingWentWrong 情況的塊,另一個是通用的塊,捕獲所有錯誤。

結論

總而言之,do-try-catch 語句是 Swift 的一個關鍵特性,它使開發人員能夠以一種結構化且可靠的方式處理程式碼中的錯誤。它提供了一種處理函式或方法可能丟擲的錯誤的方法。這可以防止崩潰並提高程式碼的健壯性和可靠性。透過使用 do-try-catch 塊,你可以構建更可靠和穩定的程式,以可預測和可控的方式處理潛在的問題。

更新於:2023年5月4日

4K+ 瀏覽量

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.