에러 처리란?

프로그램 내에서 에러가 발생한 상황에 대해 대응하고 이를 복구하는 과정

Swift 에러 처리

  • 발생(throwing)
  • 감지(catching)
  • 전파(propagating)
  • 조작(manipulating)

에러 발생시키는 방법 throw

enum PhoneError: Error {
    case unknown
    case batteryLow(batteryLevel: Int)
}

throw PhoneError.batteryLow(batteryLevel: 20)

throw 키워드를 사용하면 에러를 발생시켜 에러를 확인할 수 있다.

예시

func checkPhoneBatteryStatus(batteryLevel: Int) throws -> String {
    guard batteryLevel != -1 else { throw PhoneError.unknown }
    guard batteryLevel > 20 else { throw PhoneError.batteryLow(batteryLevel: batteryLevel) }
    return "배터리 상태가 정상입니다."
}

핸드폰의 배터리 상태를 리턴하는 함수이다. 위 함수와 do-catch, try?, try!를 사용하여 에러를 처리할 수 있다.

do-catch

사용법

do {
	try 오류 발생 가능 코드
} catch 오류 패턴 {
	처리 코드
}

예시

do {
    try checkPhoneBatteryStatus(batteryLevel: 20)
} catch PhoneError.unknown {
    print("알 수 없는 에러입니다.")
} catch PhoneError.batteryLow(let batteryLevel) {
    print("배터리 전원 부족 남은 배터리 : \(batteryLevel)%") // 배터리 전원 부족 남은 배터리 : 20% 출력
} catch {
    print("그 외 오류 발생 : \(error)")
}

try?

예시

let status = try? checkPhoneBatteryStatus(batteryLevel: -1)
print(status) // nil
let status = try? checkPhoneBatteryStatus(batteryLevel: 30)
print(status) // Optional("배터리 상태가 정상입니다.")

위 코드와 같이 try?를 사용하여 에러 처리를 할 수 있는데 에러가 발생했다면 nil을 할당하고 에러가 발생하지 않았다면 옵셔널에 감싸져 출력되게 된다.

try!

let status2 = try! checkPhoneBatteryStatus(batteryLevel: 30)
print(status2) // 배터리 상태가 정상입니다.

try!를 사용할 땐 에러가 절대 발생하지 않을 때만 사용해야 한다. 만약 try!를 썼을 때 에러가 발생한다면 런타임에러가 발생하며 프로그램이 종료된다.