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 中管理错误的代码,这些代码是受控且优雅的,确保你的应用程序即使在发生意外事件时也能继续运行。它允许你为客户提供更详细的错误通知,这使得他们更容易理解和解决问题。
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP