본문 바로가기
Swift Deeep Dive

[Swift] 오류처리(1)

by shinhyogeun 2020. 8. 9.

거의 모든 언어에서는 발생할 수 있는 오류를 대비한 기능들이 존재한다. 물론 스위프트도 마찬가지이다. 예측가능한 오류들도 있을 수 있고 그러지 못한 오류들이 또 있을 수 있다. 이번 글과 다음글에서는 우리가 어떻게 이러한 오류들을 잘 처리할 수 있는지 알아보려고한다.

이번글과 다음글은 야곰님의 스위프트 프로그래밍(3판)의 내용과 docs.swift.org/swift-book/LanguageGuide/ErrorHandling.html 을 참조해서 쓰는 글임을 밝힌다. 

 

처음에는 어떻게 오류를 표현할 수 있는지를 봐야한다. 오류는 다음의 형식으로 표현이 가능하다(enum에 대한 개념은 꼭 아셔야 합니다.)

예시는 자판기에서 음료를 뽑을 때 발생할 수 있는 오류들을 열거형(enum)식으로 나열한 것이다. 중요한 것은 Error이라는 프로토콜을 따르는 타입의 값을 통해 표현된다는 것이다. (Error이라는 프로토콜은 안은 비어있지만 단지 구분을 위해서만 존재합니다. 쉽게 말해 그냥 Error이라는 걸 표현하려고 프로토콜을 따른다고만 한거고 프로토콜의 기능적인 요소는 사용하지 않습니다.)

 

오류는 또한 저희가 임의로 던질 수도 있습니다. 그때는 throw라는 용법으로 throw VendingMashineError.invalidSelection 라고 한다면 이것은 유효하지 않은 선택이라는 에러를 발생시키게됩니다. 

 

그리고 오류는 던져질 수도 있습니다. 그때 큰 과정 순서는 던진 오류를 받고 그 오류를 처리한다는 것입니다. 다양한 오류 처리 방법 중 첫번째로 do catch구문을 살펴보겠습니다.

 

1. do catch구문을 이용한 오류처리

여기서 function이 두개가 있다 첫번째는 바로 giveMe라는 함수로 이 함수는 "func 함수이름() throws{}"라는 형식으로 자신이  에러를 던질 수 있는 함수라고 말하고 있다 그리고 매개변수가 Snack이 아닌 경우는 그에 맞는 에러를 던지고 있다.

 

그리고 두번째 함수인 order함수는 이 함수 안에서 giveMe함수를 실행한다 그런데 giveMe함수는 error를 던지는 함수였으므로 order함수는 giveMe함수에 의해 던져진 error를 받아야한다. 여기서 order안의 형태를 보면 do try catch 구문이 보인다. 우리는 이 형태로 error를 받을 것이다.

여기서 반드시 조심해야하는 부분은 catch부분이 모든 error를 다 커버해야한다는 것이다. 만약 나머지 케이스에 대한 catch부분을 안쓰면 

미흡한 catch부분이라고 error가 뜰것이다. 물론 case가 5까지 있을 때 5까지를 모두 사용해야한다는 것을 의미하는 게 아니다. 어떤 오류가 발생하더라도 커버가 가능하게 do catch구문을 써야한다. 

 

2. optional값으로 오류처리하기

 

비교적 간단하다. try대신에 try?을 사용하면 더져지는 오류는 nil값이 되므로 따로 do catch구문을 사용할 필요가 없다.

위의 코드는 do catch구문을 사용하지 않고 try를 try?로 바꾸고 실행을 한 것이다. 반환으로 nil일 나온 것을 볼 수 있다. 하지만 여기서 try?를 다시 try로 바꾸면

던져진 에러가 다뤄지지 않고있다는 에러가 뜬다. 이렇듯 optional값으로 가볍게 error를 처리할 수 있다.

물론 정말 주의해야할 점은 어떤 함수의 반환값이 Int로 되어 있을 때 try?를 사용하면 반환값이 Int?로 변한다는 것이다 !!!!!!

밑의 코드를 보자

giveMe함수는 Int를 반환한다고 되어있다. 하지만 오류를 반환하지 않는 경우도 1이아니라 Optional(1)이 반환되는 것이 보인다. 

 

다음글에서는 다시던지기와 후처리에 대해서 알아볼 예정입니다. 읽어주셔서 감사합니다!!!!!