Swift 語言中的錯誤處理


Swift 的錯誤管理是一種處理程式碼執行過程中發生的錯誤的技術。它允許你建立程式碼,在執行期間平穩地預測和處理錯誤,而不是崩潰。在這篇文章中,你將看到一些處理 Swift 程式碼錯誤的示例。

try、catch 和 throw 關鍵字只是 Swift 提供的錯誤處理工具中的一部分。這些關鍵字協同工作,使程式設計師能夠編寫無錯誤的程式碼。

Swift 中錯誤處理的工作原理的一些要點

  • 如果函式由於任何原因可能丟擲錯誤,則可以在函式宣告中使用 throws 關鍵字進行標記。

  • 呼叫可能丟擲錯誤的函式時,必須使用 try 關鍵字來指示你知道可能丟擲錯誤。

  • 如果丟擲錯誤,可以使用 catch 關鍵字捕獲和處理它。

  • 可以使用 throw 關鍵字丟擲錯誤。

以下是 Swift 中錯誤處理的語法:

enum CustomError: Error {
   case errorOne
   case errorTwo
}

func doSomething() throws {
   // This function can potentially throw two types of errors
   if someCondition {
      throw CustomError.errorOne
   } else if someOtherCondition {
      throw CustomError.errorTwo
   } else {
      // Do something else
   }
}
do {
   try doSomething()
   // No error was thrown, do something else
} catch CustomError.errorOne {
   // Handle error one
} catch CustomError.errorTwo {
   // Handle error two
} catch {
   // Handle all other errors
}

在這個例子中,doSomething() 方法能夠產生 CustomError 列舉中列出的兩個錯誤。try 關鍵字用於表示我們知道呼叫該方法時可能會產生錯誤。

如果丟擲錯誤,可以使用 catch 塊捕獲和處理錯誤。在這個例子中,每個可能的錯誤類別都由一個單獨的 catch 塊表示,而一個通用的 catch 塊用於處理所有其他錯誤。

在 Swift 中丟擲初始化器

值得注意的是,你也可以建立一個丟擲初始化器。這在你想驗證用於初始化特定物件的屬性時特別有用。例如,你可能想在建立 User 物件之前驗證使用者名稱。

示例

import Foundation
struct User {
    
   enum ValidationError: Error {
      case emptyName
      case shortName(nameLength: Int)
   }
   let name: String
   init(name: String) throws {        
      guard !name.isEmpty else {
         throw ValidationError.emptyName
      }       
      guard name.count > 2 else {
         throw ValidationError.shortName(nameLength: name.count)
      }
      self.name = name
   }
}
// Handling Errors in Swift with a do-catch statement
do {
   let user = try User(name: "Alex")
   print("Created user with name \(user.name)")
} catch {
   print("User creation failed with error: \(error)")
}

輸出

Created user with name Alex

Swift try catch:使用 do-catch 語句在 Swift 中處理錯誤

要在 Swift 中處理錯誤,可以使用 do-catch 語句。以下是一個示例:

示例

import Foundation
struct User {   
   enum ValidationError: Error {
      case emptyName
      case shortName(nameLength: Int)
   }
   let name: String
   init(name: String) throws {       
      guard !name.isEmpty else {
         throw ValidationError.emptyName
      }       
      guard name.count > 2 else {
         throw ValidationError.shortName(nameLength: name.count)
      }
      self.name = name
   }
}
do {
   let user = try User(name: "")
   print("Created user with name \(user.name)")
} catch {
   print("User creation failed with error: \(error)")
}

輸出

User creation failed with error: emptyName

捕獲特定型別的錯誤

由於我們無法指定方法將丟擲的錯誤型別,因此我們必須考慮到可能丟擲不同型別的錯誤。因此,你希望在單獨的 catch 語句中捕獲和處理特定型別的錯誤。

示例

import Foundation
struct User {    
   enum ValidationError: Error {
      case emptyName
      case shortName(nameLength: Int)
   }
   let name: String
   init(name: String) throws {        
      guard !name.isEmpty else {
         throw ValidationError.emptyName
      }        
      guard name.count > 2 else {
         throw ValidationError.shortName(nameLength: name.count)
      }
      self.name = name
   }
}
do {
   let user = try User(name: "A")
   print("Created user with name \(user.name)")
} catch User.ValidationError.emptyName {
   
   // Called only when the `User.ValidationError.emptyName` error is thrown
   print("User creation failed due to empty name")
} catch User.ValidationError.shortName(let nameLength) where nameLength == 1 {
   
   // Only when the `nameToShort` error is thrown for an input of 1 character
   print("User creation failed due to short name")
} catch let error {
   print("User creation failed with error: \(error)")
}

輸出

User creation failed due to short name

結論

Swift 具有出色的錯誤管理功能。它處理非正常流程,同時允許你編寫清晰易懂的程式碼。如果需要,我們可以透過能夠捕獲特定錯誤型別或使用 where 關鍵字來處理特定情況。確保你的方法在任何可能的情況下都會丟擲錯誤,以成為一個良好的公民!

你可以建立在 Swift 中管理錯誤的程式碼,這些程式碼是受控且優雅的,確保你的應用程式即使在發生意外事件時也能繼續執行。它允許你為客戶提供更詳細的錯誤通知,這使得他們更容易理解和解決問題。

更新於:2023年5月4日

瀏覽量:147

啟動你的 職業生涯

透過完成課程獲得認證

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