提问人:WishIHadThreeGuns 提问时间:3/28/2019 最后编辑:Haroldo GondimWishIHadThreeGuns 更新时间:5/19/2023 访问量:23964
在 Swift 中使用 JSONDecoder 进行错误处理
Error handling using JSONDecoder in Swift
问:
我在 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
答:
99赞
vadian
3/28/2019
#1
切勿在解码块中打印。这将返回一条毫无意义的通用错误消息。始终打印实例。然后你得到所需的信息。error.localizedDescription
catch
error
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
我真的很喜欢这个答案。唯一的区别 - 对于我自己的调试 - 是省略了变量,因为它太冗长了。context
catch 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
也许我没有正确解释。我想知道哪个字段导致了解码错误。有什么方法可以获取该信息吗?
评论