0

我试图找到一种更简单/更可靠的方法来从错误代码中找出 NSError 的本地化描述,而不是谷歌搜索它。

例如,我知道 NSURLErrorDomain 代码 -1003 对应于“找不到具有指定主机名的服务器”。但是,如果我尝试在代码中对其进行验证,则它不匹配。

let error = NSError(domain: "NSURLErrorDomain", code: -1003)
print(error.localizedDescription)
// "The operation couldn’t be completed. (NSURLErrorDomain error -1003.)"

在文档中查找 -1003也不匹配:“无法解析 URL 的主机名。”

因此,我正在寻找一种方法来从带有函数的错误代码或具有我期望的描述的文档中找出描述。我希望有一个类似于HTTPURLResponse.localizedString(forStatusCode:)

4

3 回答 3

2

当您像这样创建自己的NSError对象时,它localizedDescription不会为您生成。但是,当URLSession生成错误对象时,会填充本地化描述:

let url = URL(string: "https://bad.domain")!
URLSession.shared.dataTask(with: url) { data, response, error in
    if let error = error as? URLError {
        print(error.localizedDescription)  // “A server with the specified hostname could not be found.”
    }
}.resume()

因此,如果您有错误并想查看本地化描述,请执行此操作。NSError如果您手动创建自己的对象,它根本不起作用。

但一般来说,我们不会担心本地化描述,而是会测试 的各种codeURLError,寻找 的codea .cannotFindHost

let url = URL(string: "https://bad.domain")!
URLSession.shared.dataTask(with: url) { data, response, error in
    if let error = error as? URLError {
        switch error.code {
        case .cannotFindHost: print("cannotFindHost")
        case .cancelled:      print("cancelled")
        case .badURL:         print("badURL")
        // ...
        default:              break
        }
    }
}.resume()

或者,您也可以NSURLError使用 搜索旧代码值NSError,寻找NSURLErrorCannotFindHost

URLSession.shared.dataTask(with: url) { data, response, error in
    if let error = error as NSError? {
        switch error.code {
        case NSURLErrorCannotFindHost: print("cannotFindHost")
        case NSURLErrorCancelled:      print("cancelled")
        case NSURLErrorBadURL:         print("badURL")
        // ...
        default:                       break
        }
    }
}.resume()

您也可以通过按shift- command- O(字母“哦”)“快速打开”,搜索NSURLError,取消选中快速打开对话框右上角的“Swift”按钮:

在此处输入图像描述

打开NSURLError.h文件时,您可以看到那里列出的所有代码。

NSError但是,不,仅仅通过使用指定的域和代码创建一个,并localizedDescription不会神奇地为您填充。URLSession但是,创建带有描述的正确错误对象。

于 2020-12-29T01:47:56.260 回答
1

不,大多数事情都没有自动查找(存在使用 SecCopyErrorMessageString 的安全错误,但通常不是)。您必须检查标题。这是在 NSURLError.h 中:

NSURLErrorCannotFindHost =          -1003,

通常,您要查找的字符串将在 NSError 的 userInfo 中,并由生成错误的东西放置在那里。它不会从代码中查找。当 userInfo 中没有消息时,默认为localizedDescription写“操作无法完成...”

我不相信有任何内置方法可以“像系统那样”产生错误。(这将非常依赖于子系统,因为 URLErrors 有很多要填写的键不适用于其他类型的错误。)

于 2020-12-28T22:18:13.997 回答
0

伙计们,我想包含此链接以供其他人参考,因为他们正在尝试识别特定的错误代码编号。GitHub 上 Swift.org 开源项目提供的错误代码

于 2020-12-29T05:04:00.663 回答