일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 직장인공부
- 직정인자기계발
- 직장인인강
- 패캠챌린지
- 코딩테스트
- 자바스크립트
- 코딩자격증
- fastcampus
- reactnative강의
- 파이썬
- 패스트캠퍼스후기
- 자바
- 패캠
- 코딩교육
- 환급챌린지
- 직장인자기계발
- 패캠강의후기
- 수강료0원챌린지
- 패스트캠퍼스
- 30개프로젝트로배우는iOS앱개발withSwift초격차패키지Online.
- 패캠인강후기
- 패캠reactnative
- 오공완
- Today
- Total
라티의 작은 일기장
[10일차] try-catch 본문
오늘은 try-catch문에 대해 알아보려한다. 타 언어에서 주로 프로그램 실행 흐름의 예외 사항을 처리하기 위한, "예외 처리문" 이라고도 배웠던 것으로 기억한다. Java에서 프로그램 짤 때 콘솔창에 뭐시기뭐시기Exception~~ 하면서 보기 싫은 에러메시지 대신 기존에 정의했던 메시지를 출력하거나, 프로그램을 초기 상태로 돌려서 프로그램의 비정상 종료를 막기 위해 사용했었다.
Safe를 중요시하는 Swift에서는 어떻게 다른지 알아보자.
Swift에서는 발생, 감지, 전파, 조작의 4가지 경우를 처리하기 위한 7가지 클래스를 제공한다고 한다.
고도로 숙련된 개발자가 만든 프로그램이라 하더라도 예외로 인한 오류가 없을 수는 없으며,
이로 인해 Swift에서도 에러를 코드로 표현할 수 있다. 예시를 한 번 보자.
enum PhoneError: Error {
case unknown
case batteryLow(batteryLevel: Int)
}
휴대폰에 생길 수 있는 에러를 표현하기 위해 PhoneError 열거형 타입을 정의한 뒤, Error 프로토콜을 준수하도록 하였다.
이렇게 타입을 지정하듯 Error 프로토콜을 준수하도록하면, 이 자체가 에러의 표현식이 된다.
그럼 이렇게 정의한 PhoneError를 발생시켜보자. 에러를 발생시킬 때는 throw 키워드를 활용한다.
이렇게 발생한 에러의 이름과 파라미터를 쭉 출력해준다.
그러나 아직 해당 에러에 대해 처리 방법을 알려주지 않아서, 에러가 발생하였지만 처리되지는 않았다는 메시지를 볼 수 있다.
Swift에서 이런 에러를 처리하는 방법에는 4가지가 있다.
- 함수에서 발생한 오류를 해당 함수를 호출한 코드에 전파하는 방법
- do-catch 구문을 활용하여 에러를 처리
- 옵셔널 활용
- 해당 코드에서 에러가 발생하지 않을 것이라고 간주
음... 마지막은 조금 억지가 섞인 것 같지만... 그래도 뭐 그렇다고 한다.
그럼 이제 각 방법에 대해 자세히 알아보자.
첫 번째 방법은 나도 처음에 듣고 나서 이게 무슨 소리인가 싶었다.
그렇지만 코드를 보니 이해가 되었다. 역시 개발자나 개발자 지망생들은 말보다 코드로 이해하는게 더 빠르고 정확한 듯 싶다. ㅎㅎ..
func checkPhoneBatteryStatus(batteryLevel: Int) throws -> String{
guard batteryLevel != -1 else { throw PhoneError.unknown }
guard batteryLevel >= 20 else { throw
PhoneError.batteryLow(batteryLevel: 20)
}
return "배터리 상태가 정상입니다."
}
휴대폰의 배터리 상태를 확인하는 함수를 하나 정의하였다. 이 때, 파라미터가 오는 자리 뒤에 throws 키워드와 그 반환값을 정의할 수 있다. 앞서 배운 guard문을 활용해서 반환할 경우를 작성해보았는데, 다시 복기해보자면 ...
guard문은 코드의 실행 결과가 거짓인 경우 else 문을 실행하는 문법이었다.
그래서 만약 batteryLevel이 -1이라면(있을 수 없는 경우), unknown 에러를 반환하고, 20 미만이라면 batteryLow 에러를 반환한다.
그 외의 경우는 모두 "배터리 상태가 정상입니다." 문자열을 반환한다.
이렇게 어떤 함수에서 에러가 발생하면, 해당 함수의 코드에 발생한 에러를 전파(전달)하면서 에러를 처리할 수 있다.
두 번째 방법은 do-catch 구문을 활용하는 방법이다.
우선 기본형은 다음과 같다.
do {
try 오류 발생 가능코드
} catch 오류 패턴 {
처리 코드
}
do는 별다른 기능이 없다. 이런 구문이 시작한다는 것을 컴파일러에게 알려주는 정도...?
try와 catch가 중요한데, 우리가 이미 알고 있듯 try는 오류 발생 가능성이 있는 코드를 실행하고, catch는 해당 코드에서 발생한 에러 패턴을 감지하여 미리 정의해둔 코드를 실행해준다. 예시를 보자.
우선 에러 발생 가능성이 있는 함수 checkPhoneBatteryStatus에 에러를 발생시키기 위한 파라미터 -1을 넘긴 뒤, catch문이 해당 에러를 잘 잡아내는지 확인해보았다. 콘솔창에 나와있듯 잘 잡아내는 것을 볼 수 있다.
세 번째 방법인 옵셔널을 활용하는 방법을 살펴보자.
원리 자체는 try문에 옵셔널을 적용해서 에러가 발생할 경우 반환값이 없는 경우이므로 nil을 반환받고, 에러가 발생하지 않는다면 반환값을 옵셔널로 받는 방식이다.
그래서 이렇게 에러가 발생한 경우엔 상수에 nil이,
발생하지 않은 경우엔 반환값이 옵셔널로 저장되어 있음을 확인할 수 있다.
네 번째 방법은 코드에 오류가 발생하지 않을 것이라 확신할 때 쓸 수 있는 방법인데,
방법 자체는 세 번째 방법에서 try문에 !를 붙여주면 된다.
그러면 이렇게 강제 옵셔널 바인딩마냥 반환값의 옵셔널이 해제되어 저장된다.
만약 nil인 경우 런타임 에러가 발생하게되니, 주의하면서 사용하자.
패스트캠퍼스 바로가기 : http://bit.ly/3Y34pE0
> 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'Swift' 카테고리의 다른 글
[12일차] [명언 생성기 앱] UIKit & UIViewController (0) | 2023.03.03 |
---|---|
[11일차] 클로저 (0) | 2023.03.02 |
[9일차] 익스텐션, 열거형, 옵셔널 체이닝 (0) | 2023.02.28 |
[8일차] 프로토콜 (0) | 2023.02.27 |
[7일차] assert와 guard (0) | 2023.02.26 |