【问题标题】:How to find the error description from an NSError code?如何从 NSError 代码中找到错误描述?
【发布时间】:2020-12-28 22:04:29
【问题描述】:

我试图找到一种比 Google 搜索更简单/更可靠的方法来从错误代码中找出 NSError 的本地化描述。

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

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

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

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

【问题讨论】:

    标签: ios nserror nsurlerrordomain


    【解决方案1】:

    当您像这样创建自己的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 对象,它根本不起作用。

    但一般来说,我们不会担心本地化的描述,而是测试URLError 的各种code 值,寻找.cannotFindHostcode

    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()
    

    或者,您也可以使用NSError 搜索旧的NSURLError 代码值,寻找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(字母“哦”)“快速打开”,搜索@987654341 @,取消选中快速打开对话框右上角的“Swift”按钮:

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

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

    【讨论】:

      【解决方案2】:

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

      NSURLErrorCannotFindHost =          -1003,
      

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

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

      【讨论】:

        【解决方案3】:

        伙计们,我想包含此链接以供其他人在尝试识别特定错误代码编号时参考。 Error Codes provided by the Swift.org open source project on GitHub

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-09
          • 2013-06-06
          • 2020-06-10
          相关资源
          最近更新 更多