[Swift] 예외 처리 try catch

김상우·2021년 10월 29일
0

reference : https://twih1203.medium.com/swift-예외처리-throws-do-catch-try-하기-c0f320e61f62

Swift 예외처리

  • 예외처리 3단계
  1. 오류의 종류 정의하기
  2. 발생한 오류 던지기
  3. 던진 오류 처리하기

( 오류를 던진다 = 오류를 처리하는 곳으로 전달한다 )

  • 에러, 예외 처리는 프로그래밍에 있어서 굉장히 중요하다.
    예를 들어, 파일을 디스크에 저장하는 간단한 과정에서도 디스크 공간이 가득차서 더 이상 저장할 수 없다던지, 에러는 언제든 발생할 수 있다.

1. 오류의 종류 정의하기

  • 열거형, Error 타입으로 오류의 종류 정의하기
enum PhoneError: Error {
    case unknown
    case batteryLow(batteryLevel: Int)
}

throw PhoneError.batteryLow(batteryLevel: 20)

2. 발생한 오류 던지기

  • 함수에 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 "배터리가 충분합니다."
}
  • 에러의 종류를 잘 나누고 던졌지만, 에러를 던지기만 하면 프로그램이 멈추게 됨. 에러를 처리해주는 과정을 꼭 포함해야 함.

3. 던진 오류 처리하기

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)  // -> 배터리가 충분합니다.
// 만약 에러가 발생한다면 프로그램 강제 종료.
profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.

0개의 댓글