reference : https://twih1203.medium.com/swift-예외처리-throws-do-catch-try-하기-c0f320e61f62
- 예외처리 3단계
- 오류의 종류 정의하기
- 발생한 오류 던지기
- 던진 오류 처리하기
( 오류를 던진다 = 오류를 처리하는 곳으로 전달한다 )
- 에러, 예외 처리는 프로그래밍에 있어서 굉장히 중요하다.
예를 들어, 파일을 디스크에 저장하는 간단한 과정에서도 디스크 공간이 가득차서 더 이상 저장할 수 없다던지, 에러는 언제든 발생할 수 있다.
- 열거형, Error 타입으로 오류의 종류 정의하기
enum PhoneError: Error { case unknown case batteryLow(batteryLevel: Int) } throw PhoneError.batteryLow(batteryLevel: 20)
- 함수에 throws 키워드를 사용해서 throwing 함수를 만든다.
// throwing 함수 // 함수에 throws 키워드를 사용한다. func checkPhoneBatteryStatus(batteryLevel: Int) throws -> String { // batteryLevel 이 -1 이라면 guard batteryLevel != -1 else { throw PhoneError.unknown } // batteryLevel 이 20 이하라면 guard batteryLevel > 20 else{ throw PhoneError.batteryLow(batteryLevel: batteryLevel) } return "배터리가 충분합니다." }
- 에러의 종류를 잘 나누고 던졌지만, 에러를 던지기만 하면 프로그램이 멈추게 됨. 에러를 처리해주는 과정을 꼭 포함해야 함.
1. do catch 문
// do catch 문으로 오류 처리 do { try checkPhoneBatteryStatus(batteryLevel: 10) } catch PhoneError.unknown { print("unknown error !") } catch PhoneError.batteryLow(let level) { print("low battery ! current battery : \(level)%") } catch { // error 라는 지역상수가 자동으로 생성됨 print("예상 밖의 오류 : \(error)") } // -> low battery ! current battery : 10%
2. try? 문
- 에러를 옵셔널 값으로 표현
- 에러가 나면 nil, 에러가 나지 않으면 옵셔널 껍질에 둘러싸인 채로 리턴
// try? 문 // 에러를 옵셔널 값으로 변환하여 표현 // 동작하던 코드가 오류를 던지면, 그 코드의 반환값은 nil이 됨 let status = try? checkPhoneBatteryStatus(batteryLevel: -1) print(status) // -> nil let status2 = try? checkPhoneBatteryStatus(batteryLevel: 40) print(status2) // -> Optional("배터리가 충분합니다.")
3. try! 문
- 에러가 아니라고 절대적으로 확신할때만 사용
- 옵셔널 껍질이 벗겨짐
// try! 문 // 에러가 나지 않는다고 절대적으로 확신할 때만 사용 // 옵셔널 껍질이 벗겨짐 let status3 = try! checkPhoneBatteryStatus(batteryLevel: 30) print(status3) // -> 배터리가 충분합니다. // 만약 에러가 발생한다면 프로그램 강제 종료.