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.