티스토리 뷰

iOS

iOS ) DecodingError

Zedd0202 2019. 8. 25. 20:34
반응형


안녕하세요 :) Zedd입니다.

날씨가 정말 선선해져따.....

세상의 모든 비염 분들..이겨냅시다....................



암튼 오늘은 DecodingError를 공부해보려고 합니다.




DecodingError가 모냐면..

말그대로 Decoding할때 나는 Error......


아마 많이 보셨던 에러..



이게 DecodingError입니다.,

디코딩 할때 에러 난거니깐...



그런데....이 자식을 자세히 보면..


...

얘 enum인거 얼마전에 알았음ㅎ...

암튼 얘 enum이애ㅔ요!!!

그럼 어떤 case가 있는지 알아봅시다.



이렇게 4가지 case가 있네요.


하나씩 봅시댜


1. dataCorrupted


정의는 

데이터가 손상 되었거나(corrupted) 유효하지 않다는 걸 나타내는 에러


뭔 에러인지 감이 안잡히는데

일단 재현해보겠읍니다.



아~~~~ 

"The given data was not valid JSON."

이거 많이 봤지...




뭐가 잘못된지 아시겠나욥???






age에 1000다음에 쉼표가 없음 ㅎ

암튼 이럴때 dataCorrupted에러가 나는것 같아요. 

이친구는

associated value로 context를 가지고 있는데요. 


Context는 struct로



이런 프로퍼티들을 가지고 있어요. 이 프로퍼티들은 계속 나오기 때문에 여기서 설명하구 넘어갈게요.


codingPath

실패한 디코드 호출 지점에 도달하기 위해 사용된 coding key의 path(경로)입니다. 

정의;;만 보면 잘 이해가 안갈수도 있는데 



지금 age가 Int타입인데, Json string안에서는 string으로 되어있죠?

그럼 당연히 error가 나겠죠? 많이 겪어보신 분들은 아시겠지만 type mismatch에러가 나게 되죠. 



그럼 어느 CodingKey에서 type mismatch가 난지 위에 처럼 알려주게 되는데요. 

이게 바로 codingPath..


그리고 두번째로 


debugDescription은 뭐가 잘못됐는지..!!! 디버깅 목적의 description이라구 합니다. 



typeMismatch의 경우 "Expected to decode Int but fond a string/data instead"


 우리가 지금 보던 dataCorrupted는 



"The given data was not valid JSON."가 debugDescription으로 나오네요.


암튼 진짜 뭐가 잘못됐는지 알려주는....아주 친절한 칭구ㅇ네욥


마지막으로 underlyingError.

underlying 뜻이 밑에있는, 기초를 이루는, 근본적인..이라고 하는데 그럼 근본적인 에러..라고 번역하면 되겠죠? 


정의는 

이 에러를 야기시킨 근본적인 에러..

if any라고 하니 optional인가 봅니다. 

ㅇㅇㅋ


이게 nil일때가 많던데,  dataCorrupted에서는 nil이 아니네욥..!



뭐 Json string에서 52번째 character가 뭐 이상한 형식이다 뭐 이런말 같네욥..!!
아무튼 이거 설명은 다 했고, 


흠...뭔가 눈에 안들어옴..


깔끔하긴 한데..

근데 이렇게 하면 print문이 모든 catch문에 들어가서 아니 그건 뭐 case도 마찬가지..

아무튼 이렇게 할 수 있습니다.


이러면 이렇게..뭐 여러 정보들이 잘 뜨게 되는데.

한가지가 넘 거슬려..



음 저는 지금 Decoding하면서 나는 에러를  콘솔창에 띄울 때, 

어떤 에러인지 정말정말...바로 알 수 있게 해주고싶은게 목적이에요!

근데 저희는 지금 decoding error가 났을 때 


이러한 케이스들이 있는걸 압니다. 근데



넘 안보이는것 같아서..

암튼 저 로그(?)들을 보면 지금 케이스가 data currupted..라는 정보를 알 수가 없죠..!!!

아니 이거 꼭 안알아도 되지만........

.....

...

사실 

"The given data was not valid JSON."

만 보면 사실 뭐 바로 알겠지만..저는 뭔가 지금 어떤 case에 걸린지.........알고싶습니다...

근데 지금 이 catch문 안에서 그걸 알려면 직접 print해줘야해..
아악


아니 스위프트 아ㅇ ㅣ진짜 만들다 말래 자꾸?
야 애플 야

아니 이렇게


catch에 아무 조건 안달고 걍 하면 error가 잡히는데



이렇게 조건을 주면 error가 안잡힘.

사실 바로 그냥



print(error)하면



이렇게 다 나와서 사실 제가 하려는 목적을 달성하긴 하지만 일단 가독성이 너무 안좋고

error가 DecodingError라는 보장을 지금 코드에서는 할 수 있겠지만..아마 그렇겠지만 

저렇게 DecodingError가 아니면 무조건 return 하는것도 거슬리고 

그렇다고 if let은 너무...depth가 깊어져서..


저...너무 바라는게 많나욥..?



아 이러면 좀 좋을텐데 error에 왜 접근을 못하게 해놨어 이 애플......

아니 지금 DecodingError공부하는 글인데 제ㅐ가 지금 뭘하고있는건지

이건 좀 고민해봐야겠네요.


2. keyNotFound



이제부터는 설명 자세히 안할게욘

얘는 뭐 이름만 봐도..아시겠지만 key가 없댜...



뭐 이런상황이겠죠?

jsonString에 startDate가 없는데 startDate가 옵셔널도 아니기 때매...

암튼 에러남.



keyNotFound는 associated value를 2개를 가지고있어요.

 아까 코딩키 뭐 나오지 않았나...?


네 아까 본건


coding path구요. coding key의 경로라고 했죠. 

이 codingPath의 타입은


CodingKey타입의 배열입니다.

암튼 이 타입이

associated value로 들어가 있는거에요. Context는 아까랑 똑같고 :D



얘도 뭔가 프로퍼티가 좀 있는데, 움..........

제 생각에....아주 개인적인 생각......으로는 이 codingKey에 있는 값들은 쓸 필요가 없음



암튼 뭐 이렇게 나오는데...



ㅎ 잘 안보이네..암튼 context의 debug description으로 뭐가 문제인지 충분히 알 수 있는 것 같아요. 


아무리 생각해도...이게 "keyNotFound"에러라는걸 알 수 읶ㅆ을까?



3. typeMismatch



이름만봐도 알수있죠. 타입이 맞지 않을 때 나는 에러입니다.

associated Value로 type과 context를 가지고 있네요.



타입과 context를 출력해보곘습니다.



type은 실제 내가 지정해준 타입같아요. 



age가 Int였는데 String으로 들어온 상황. 

type은 그니까 내가 기대한 타입을 알려주는 것 같습니다!


context에는 underlying error빼고는 전부 아주 중요한 정보를 보여주는 것 같아요. 


ㅁ마지막 

4. valueNotFound



정의 보면 non-optional value를 기대했는데 null이 발견되었을때 나타나는 에러 뭐 이러네요.


typeMismatch와 마찬가지로 type과 context를 associated value로 가지고있습니다.



이렇게 isPerson을 null로 줘서 디코딩 하면 

valueNotFound에러가 나게 되겠죠?



역시 type은 기대한 타입이 나오고

뭐 context도 underlyingError빼고 중요한 정보들이...나오는..군요


아무튼 이렇게 DecodingError의 모든 케이스들을 다 공부해봤습니당!!

Codable(Encodable & Decodable)을 쓰시는 분들은 아마 바로바로 이해 하셨을듯...!!





지금 좀 어떻게 예쁘게 출력할 방법이 없을까...

여러가지 해보고있는데 뭐 각 case마다 print문이 들어가야한다는 사실은 변함이 없네욥..

그냥 지금 어떤 case에러인지 안알아도 된다고 쳐도 debugDescription은 필수인것 같고, codingPath도 typeMismatch랑 valueNotFound에서는 꼭 필요...


근데 얘네들이 case안에 associated value로 들어가있는거다보니...........................

일단...switch case...는 깔고..들어가니까여ㅛ..


공부하고나면 뭐 어떻게 할 수 있을줄 알았는데 그것도 아니네

도움이 되었길 바랍니다!



반응형

'iOS' 카테고리의 다른 글

iOS ) ContentInset  (2) 2019.09.08
iOS ) UITableViewCell / UICollectionViewCell의 View들  (1) 2019.09.04
iOS) decelerationRate  (0) 2019.08.24
iOS ) Sign in with Apple (1)  (9) 2019.07.28
iOS ) semanticContentAttribute...  (1) 2019.07.10