在 Swift 中,可以使用 Error 协议来定义自定义错误。定义一个结构体、枚举或类,遵循 Error 协议即可。例如:
enum NetworkError: Error {
case unavailable
case invalidURL
case serverError(statusCode: Int)
}
上面的代码定义了一个 NetworkError 枚举,它遵循了 Error 协议。这个枚举有三种情况分别表示网络不可用、无效的 URL 和服务器返回错误状态码。这些错误情况可以在实际使用时通过 throw 关键字抛出。
func fetchData(from url: String) throws -> Data {
guard let url = URL(string: url) else {
throw NetworkError.invalidURL
}
let session = URLSession.shared
let dataTask = session.dataTask(with: url) { (data, response, error) in
if let error = error {
// Handle network error
return
}
if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode != 200 {
let serverError = NetworkError.serverError(statusCode: httpResponse.statusCode)
throw serverError
}
if let data = data {
return data
}
}
dataTask.resume()
}
do {
let data = try fetchData(from: "https://example.com")
// Use fetched data
} catch let error {
// Handle error
}
上面的代码中,fetchData(from:) 方法尝试从传入的 URL 中获取数据。如果 URL 无效,会抛出 NetworkError.invalidURL 错误。如果获取过程中发生了网络错误,不会抛出具体的错误,而是直接结束。如果服务器返回了错误的状态码,会抛出 NetworkError.serverError 错误。如果获取数据成功,返回数据。在调用 fetchData(from:) 方法时,使用 do-catch 语句捕获可能抛出的错误。