【问题标题】:Getting the error code and description from a session.dataTask call从 session.dataTask 调用中获取错误代码和描述
【发布时间】:2020-06-10 16:28:35
【问题描述】:

我正在从我的应用中调用一些 API。我想获取并处理错误代码。似乎有很多关于如何检索和处理响应代码的信息,但关于错误代码的信息却很少。我想访问错误代码以防万一,假设用户没有互联网连接,因此对 API 的调用失败。我正在使用此代码:

session.dataTask(with: request, completionHandler: { (data: Data?, response: URLResponse?, error: Error?) in

        if let error = error {
            print("Tide Station API call failed with error \(error)")
            return
        }

        if let response = response as? HTTPURLResponse {
            print("Tide Station API call response is \(response.statusCode)")
        }

        if let data = data
        {
            do {
                let result = try JSONDecoder().decode(TideStations.self, from: data)
                self.tideStations = result.stations
                print("\(result.stations.count) Tide Stations successfully loaded")
                self.showTideStationsOnMap()
            } catch {
                print("Error while stations parsing: \(error)")
            }
        }
    }).resume()

当我的设备处于飞行模式时,它会在调试区域中生成以下输出,即我强制 API 调用失败的一种确定方式:(请注意,我在错误处理打印语句中将该区域加粗)

2020-02-26 17:57:58.235368+0000 APITest[5464:2590011] 任务 . 完成错误 [-1009] 错误域 = NSURLErrorDomain 代码 = -1009 "Internet 连接似乎处于脱机状态。" UserInfo={NSUnderlyingError=0x283a918f0 {错误域=kCFErrorDomainCFNetwork Code=-1009 "(null)" UserInfo={_kCFStreamErrorCodeKey=50, _kCFStreamErrorDomainKey=1}}, NSErrorFailingURLStringKey=https://api.sunrise-sunset.org/json?lat=57.5081&lng=-1.7841&date=2020-06-21&formatted=0, NSErrorFailingURLKey=https://api.sunrise-sunset.org/json?lat=57.5081&lng=-1.7841&date=2020-06-21&formatted=0, _kCFStream_ErrorDomainKey=1, =50, NSLocalizedDescription=互联网连接似乎离线。} Astronomical Times API 调用失败并出现错误 Error Domain=NSURLErrorDomain Code=-1009 “Internet 连接似乎处于脱机状态。” UserInfo={NSUnderlyingError=0x283a918f0 {错误域=kCFErrorDomainCFNetwork Code=-1009 "(null)" UserInfo={_kCFStreamErrorCodeKey=50, _kCFStreamErrorDomainKey=1}}, NSErrorFailingURLStringKey=https://api.sunrise-sunset.org/json?lat=57.5081&lng=-1.7841&date=2020-06-21&formatted=0, NSErrorFailingURLKey=https://api.sunrise-sunset.org/json?lat=57.5081&lng=-1.7841&date=2020-06-21&formatted=0, _kCFStream_ErrorDomainKey=1, =50, NSLocalizedDescription=互联网连接似乎离线。}

在这个例子中,我想从中提取互联网连接出现故障的事实并建议用户。我原以为对错误代码提取的支持与对结果代码提取的支持类似。只是说发生了错误(易于检测)并在其他地方处理(例如,在调用 API 之前检测到没有互联网)会更正常吗?如果是这样,我要防备什么叫喊声?

【问题讨论】:

    标签: swift api


    【解决方案1】:

    swift 中的Error 类不包含错误代码和错误域。但是,如果您打印错误,您肯定可以在日志中看到错误代码和域。

    您可以通过简单地将 Swift 的 Error 转换为旧的 Objective-C NSError 来访问它们。此类可免费桥接,因此无需检查转换是否失败或使用as! 强制执行转换。只需这样做:

        let nsError = error as NSError
        print("Error code is: \(nsError.code)")
    

    【讨论】:

    • 谢谢,这有帮助。知道为什么语言的焦点似乎集中在状态码上,而且几乎不支持错误吗?
    • 我不能确定,但​​我可以给你一个猜测。对错误代码的关注主要是 Objective-C 方法的一部分。 Swift 本身更多地依赖于错误类型(意味着您将Error 类作为子类)——这更像是异常模式。问题是 Apple 的大部分框架仍然是用 Objective-C 实现的,主要是为了让用 ObjC 编写的应用程序保持活力,因为很难使用来自 ObjC 的 Swift 代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多