在 Swift 中使用 JSONDecoder 进行错误处理

Error handling using JSONDecoder in Swift

提问人:WishIHadThreeGuns 提问时间:3/28/2019 最后编辑:Haroldo GondimWishIHadThreeGuns 更新时间:5/19/2023 访问量:23964

问:

我在 Swift 中使用,需要获得更好的错误消息。JSONDecoder()

在调试描述(例如)中,我可以看到诸如“给定数据不是有效的 JSON”之类的消息,但我需要知道它而不是网络错误(例如)。

let decoder = JSONDecoder()
if let data = data {
   do {
      // process data

   } catch let error {
      // can access error.localizedDescription but seemingly nothing else
   }
}

我试图投射到 ,但这似乎没有透露更多信息。我当然不需要字符串 - 即使是错误代码也比这更有用......DecodingError

JSON 斯威夫特

评论

0赞 Aks 3/28/2019
您必须将错误强制转换为特定类型才能访问属性。有关更多详细信息,请查看文档。docs.swift.org/swift-book/LanguageGuide/ErrorHandling.html
0赞 WishIHadThreeGuns 3/28/2019
我知道,我尝试了 DecodingError。但它除了错误之外没有更多细节。
0赞 Aks 3/28/2019
你能发布你尝试过的代码吗?这将有助于我们获得有关您的问题的更多背景信息。
0赞 WishIHadThreeGuns 3/28/2019
print (“读取数据时出错”,错误为!DecodingError) print (“error”, error.localizedDescription) let decerr = error as!解码错误 打印 (decerr.errorDescription) 打印 (“resaon”, decerr.errorDescription)

答:

99赞 vadian 3/28/2019 #1

切勿在解码块中打印。这将返回一条毫无意义的通用错误消息。始终打印实例。然后你得到所需的信息。error.localizedDescriptioncatcherror

let decoder = JSONDecoder()
if let data = data {
   do {
      // process data

   } catch  {
      print(error)
   }
}

或者对于完整的错误集使用

let decoder = JSONDecoder()
if let data = data {
    do {
       // process data
    } catch let DecodingError.dataCorrupted(context) {
        print(context)
    } catch let DecodingError.keyNotFound(key, context) {
        print("Key '\(key)' not found:", context.debugDescription)
        print("codingPath:", context.codingPath)
    } catch let DecodingError.valueNotFound(value, context) {
        print("Value '\(value)' not found:", context.debugDescription)
        print("codingPath:", context.codingPath)
    } catch let DecodingError.typeMismatch(type, context)  {
        print("Type '\(type)' mismatch:", context.debugDescription)
        print("codingPath:", context.codingPath)
    } catch {
        print("error: ", error)
    }
}

评论

2赞 Peter Schorn 8/13/2020
localizedDescription仅当需要向最终用户显示某些内容时,才应使用。
1赞 rustyMagnet 11/4/2020
我真的很喜欢这个答案。唯一的区别 - 对于我自己的调试 - 是省略了变量,因为它太冗长了。contextcatch let DecodingError.keyNotFound(key, _) { print("[!]Key '\(key)' not found")
0赞 infiltratingtree 5/13/2023
您能否访问类型不匹配的属性?假设一个字段在我需要 String 时以 Int 的形式返回,在这种情况下,我想为该属性设置默认值
0赞 vadian 5/13/2023
@infiltratingtree 这毫无意义,因为当发生错误时,解码过程将被中断和终止。
0赞 infiltratingtree 5/15/2023
也许我没有正确解释。我想知道哪个字段导致了解码错误。有什么方法可以获取该信息吗?