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+ 浏览量

启动你的职业生涯

完成课程获得认证

开始学习
广告