在 Swift 中,如何定义自定义错误?

8 min read

在 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 语句捕获可能抛出的错误。