WishIHadThreeGuns
WishIHadThreeGuns

Reputation: 1469

Error handling using JSONDecoder in Swift

I am using JSONDecoder() in Swift and need to get better error messages.

Within the debug description (for example) I can see messages like "The given data was not valid JSON", but I need to know it is that rather than a network error (for example).

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

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

I tried to cast to a DecodingError, but this does not seem to reveal more information. I certainly don't need the string - even an error code is much more helpful than this...

Upvotes: 31

Views: 29459

Answers (1)

vadian
vadian

Reputation: 285082

Never print error.localizedDescription in a decoding catch block. This returns a quite meaningless generic error message. Print always the error instance. Then you get the desired information.

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

   } catch  {
      print(error)
   }
}

Or for the full set of errors use

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

Upvotes: 110

Related Questions