저번시간에 이어 오늘도 마저 오류를 처리하는 방법들에 대해서 알아보려고 한다. 오늘은 크게 3가지를 볼 것이다. 첫번째로는 오류가 절대로 나지 않을 것을 확신할 때 오류를 어떻게 처리할 것인지와 두번째로는 오류를 던지는 함수를 매개변수로 받아 다시 또 오류를 던지는 함수 그리고 마지막으로는 후처리 defer에 대해서 알아보자.
1) 오류가 절대 나지않을 것을 확신할 때
오류가 나지 않는 다면 오류 던지는 함수를 try!로 받아주면 아주 간단하게 끝난다.
위의 코드를 보면 somThrowingFunction은 매개변수로 false를 받으면 절대 오류가 나지 않는다. 그러면 오류가 생기지 않음으로 별도로 do catch구문을 사용하지 않아도 된다.(do catch는 오류가 발생했을 때 그 오류를 처리하려고 쓰는 구문이기 때문이다.) 그냥 단순하게 try!로 받는다면 가볍게 처리할 수 있다. 하지만 만약 try!로 절대 오류가 나지않다고 했는데 오류를 던지면 런타임 오류가 나게 된다.(스위프트에서 !는 언제나 확실할 때만 써야한다 그렇지않으면 약속을 어긴 것을 판단해 런타임오류가 난다. 암시적 추출 옵셔널도 그렇고 강제 타입캐스팅 다 똑같다.)
2) 오류를 다시 던지는 함수
함수(메서드)는 rethrows를 사용하여 자신의 매개변수로 전달받은 함수가 오류를 던진다는 것을 표현 할 수 있다. rethrows를 쓰려면 적어도 하나의 매개변수가 오류를 던지는 함수여야한다. 그리고 말그대로 다시 오류를 받아 던진다. 코드로 보자
someThrowingFunction이라는 오류를 던지는 함수를 someFunction이 매개변수로 받고 다시 오류를 던진다. 그래서 do catch구문에서 try someFunction을 실행하면 someFunction 안에서 someThrowingFunction이 던진 justSomeError를 someFunction이 받아서 다시 던져서 catch가 처리하는 방식이다.(이해가 안된다면 침착하게 다시 읽으면서 이해해보세요..ㅎㅎ)
그리고 다시 던지기 함수는 스스로 오류를 던지지 못하는데 내부에서 do-catch구문으로 매개변수의 오류를 처리할 때 catch절 안에서는 throw사용이 가능하다.(반드시 매개변수의 오류만을 대상으로만!! 가능합니다.)
다음 코드에서보면 다시던지기 함수 내부에서 do-catch구문을 사용하고 callback함수가 던진 오류를 받아 다시 다른 자기만의 오류를 던지고 있다. 다시던지기라는 건 매개변수가 던진 오류를 받아 다시던지는데 그대로 다시던지던지 아니면 자신만의 오류로 다시 바꿔서 던지던지 둘 중 무조건 하나라는 것을 자연스럽게 이해하기 바란다.
3) 후처리 defer
후처리 defer는 지금까지와의 개념과는 살짝 다르다. defer{} 이렇게 실행하면 저 괄호안에 들어있는 것은 코드블럭을 나가기 전에 반드시 실행되는 것이다. 예를 보는 것이 이해가 더 빠를 것 같다.
지금은 보여주려고 함수정의를 디테일하게 하지 않았다. 위의 코드를 보면 writeData함수는 다양하게 return되는 경우가 있지만 어떤 경우이든 wirteData함수를 빠져나가기 전에 defer안의 내용은 반!드!시! 실행된다. 조금 복잡한 경우를 보자
유념해야할 점은 defer가 실행될 때는 역순으로 실해되는 것이다. 이것을 보면 처음에 0출력 한칸띄고 It"s even출력 한칸 띄고 줄바꾸고 A출력! 그리고 i는 1로간다. 1에서는 if절 안에 들어가지 않으므로 줄바꿈은 안 일어난다. 이런식으로 출력하면 그 결과는 다음과 같다.
그리고 do구문을 catch없이 내부에 또 한 단계의 하위블록을 만들고자 한다면 단독으로 사용이 가능하다. 다음의 예제를 보자
조금 복잡해보이지만 침착하게 보자! 일단은 1은 가장먼저 출력되고 다음은 do구분안의 4이다 그리고 do를 나오면서 그 안의 defer가 실행되므로 3이나온다. 그후 6이나오고 역순으로 5 그리고 2가 나와서 순서는 143652이다.
지금까지 정말 다양한 방법으로 오류를 처리하는 방법을 알아보았다. 오류를 무시하고 가려고 배운 것은 아니고 오류는 우리가 예상못하게 잘 일어나므로 이러한 방법들을 사용하여 조금 더 섬세하게 오류를 처리하기 위해 우리가 배운 것들을 잘 활용하자.
'Swift Deeep Dive' 카테고리의 다른 글
[Swift] 옵셔널 체이닝 & Guard (0) | 2020.08.23 |
---|---|
[Swift] 오류처리(1) (0) | 2020.08.09 |
[Swift] Map, Filter, Reduce 함수 알아보기 (0) | 2020.08.02 |
[Swift] ARC에 관한 문제 해결하기(클로저에 관하여) (0) | 2020.07.25 |
[Swift] ARC에 관한 문제 해결하기(클래스에 관하여) (0) | 2020.07.19 |