Swift의 에러처리

sun02·2021년 8월 30일
0

iOS

목록 보기
6/27
    1. 발생(throwing)
    1. 감지(catching)
    1. 전파(propagating)
    1. 조작(Manipulating)

스위프트에서 에러는 Error 프로토콜을 따르는 타입의 값으로 표현된다.

  • 에러 프로토콜은 요구사항이 없는 빈 프로토콜이지만 오류를 표현하기 위해서 이 프로토콜을 채택해야한다.
  • 열거형은 오류 원인을 나누고 해당 오류의 특성에 대한 추가 정보를 전달하는 모델을 만드는데 적합하다.

다음과 같이 열거형으로 오류의 종류를 표현하는 것이 가장 일반적이다.


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

만약 배터리가 부족할 때 오류를 발생시키고 싶다면, throw를 사용하여 오류를 발생시킬 수 있다.

throw PhoneError.batteryLow(batteryLevel: 20)


-> 오류 발생

스위프트에서 오류를 처리하는 네 가지 방법

    1. 함수에서 발생한 오류를 해당 함수를 호출한 코드에 전파
    1. do catch 구문을 이용하여 오류 처리
    1. optional 값으로 오류 처리
    1. 오류가 발생하지 않을 것이라고 확신하는 방법

1. 함수에서 발생한 오류를 해당 함수를 호출한 코드에 전파하기

  • 오류가 발생할 수 있음을 나타내기 위해서 함수, 매개변수, 생성자 매개변수 뒤에 throw 키워드 작성

func checkPhoneBatteryStatus(batteryLevel: Int) throws -> String {
	guard batteryLevel != -1 else { throw PhoneError.unknown }
    guard batteryLevel >= 20 else { throw PhoneError.batteryLow(batteryLevel: 20) }
    
    return "배터리 상태가 정상입니다."
    // > guard 조건에 모두 걸리지 않으면 문자열 반환됨
}

guard 문은 false 일 때 else 구문이 실행되고 함수가 조기종료되기 때문에 batteryLevel이 -1 이거나 20보다 작다면 else 구문이 실행되고, throw 에러를 던진 후 함수가 종료된다

2. do catch 문으로 오류 처리하기

  • 함수, 매서드, 생성자 등에서 오류를 던져주면 오류 발생을 전달받은 코드 블럭은 do catch 구문을 사용하여 오류를 처리한다.
  • do 안의 코드에서 오류를 던지고 catch 에서 오류를 전달 받아 예외 처리 한다.

do {
	try 오류 발생 가능 코드
} catch 오류 패턴 {
	처리 코드
}
do {
	try checkPhoneBatteryStatus(batteryLevel: -1)
} catch PhoneError.unknown {
	print("알 수 없는 에러입니다.")
} catch PhoneError.batteryLow(let batteryLevel) {
	print("배터리 전원 부족, 남은 배터리 : \(batteryLevel)%")
} catch {
    print("그 외 오류 발생 : \(error)")
}

마지막 catch 문은 unknown 에러도, batteryLow 에러도 아닌 경우 실행되는 구문이다. 오류의 종류를 명시하지 않아도 코드블럭을 생성하면 블럭 내부에 암시적으로 error 라는 이름의 지역상수가 오류 내용으로 들어오게 된다.

  • checkPhoneBatteryStatus 함수에서 batteryLevel == -1 인 경우 PhoneError.unknow을 throw 되어 do catch 문에서 phoneError.unknown 인 케이스이므로 "알 수 없는 에러입니다." 가 출력된다.

3. optional 값으로 오류 처리 (try ?)

  • 오류를 옵셔널 값으로 변환하여 처리할 수 있다.

try? 표현을 통해 동작하던 코드가 오류를 던지면 그 코드의 반환값은 nil이 된다


let status = try? checkPhoneBatteryStatus(batteryLevel: -1)
print(status)

이 때 만약 함수가 오류를 발생하지 않는다면

옵셔널 값이 출력된다.

4. 오류가 발생하지 않을 것이라고 확신하는 방법(try!)

  • throwing 함수나 매서드가 에러를 던지지 않을 것이라 확신할 때 사용

let status2 = try! checkPhoneBatteryStatus(batteryLevel: 40)
print(status2)

만약 오류가 발생한다면

프로그램이 강제로 종료된다.

출처: 패스트캠퍼스 iOS 강의

0개의 댓글