Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[Refactoring] 10-6 API 리펙토링 (오류 코드를 예외로 바꾸기) 본문

Refactoring (리펙토링)

[Refactoring] 10-6 API 리펙토링 (오류 코드를 예외로 바꾸기)

jake-kim 2023. 7. 13. 01:43

오류 코드를 예외로 바꾸기

  • 하드코딩된 상수인 매직 넘버를 사용하여 오류처리를 하는 경우가 있는데, 매직 넘버를 사용하면 의미나 목적을 이해할 수 없으므로 매직 넘버를 사용하면 안좋고 예외로 바꾸어야함

ex) 매직 넘버 예시

// 매직 넘버를 사용한 예시
func calculateAreaOfCircle(radius: Double) -> Double {
    return 3.14159 * radius * radius
}

// 매직 넘버를 상수로 대체
let pi = 3.14159
func calculateAreaOfCircle(radius: Double) -> Double {
    return pi * radius * radius
}

ex) 예외 처리를 하지 않은 오류

enum FetchItemType: CaseIterable {
    static var allCases: [FetchItemType] = [.item(""), .fail]
    
    case item(String)
    case fail
}

let item = fetchItem()
print(item)
    
private func fetchItem() -> FetchItemType {
    FetchItemType.allCases.randomElement()!
}

예외 처리의 핵심

  • 예외를 던지는 곳은 어디에서나 가능하지만, 예외를 처리하는 곳은 콜스택 가장 상위여야함
    • 예외를 처리하는 곳은 콜스택 가장 상위라는 의미는, 예외를 던지는 함수에서는 계속 위로 예외를 던지는 코드를 만들어야함
  • 콜스택 가장 상위여야하는 이유?
    • 함수를 사용하는 쪽에서 예측가능하도록 함수를 작성해야 처음 보든 개발자라도 쉽게 수정하고 유지보수에 유리한 코드 관리가 가능
    • 콜스택 가장 상위까지 오류를 던지지 않고 중간에 처리하는 경우, 어떤 처리가 들어갈지 함수를 사용하는 쪽에서 예측이 힘들어지므로 가장 상위로 예외를 던지는 것이 중요
  • A, B, C 함수가 있을 때, A에서 B를 호출하고 B에서 C를 호출하면 C에서 예외가 A까지 도달해야함
  • 아래처럼 C에서 예외를 던지는 코드가 있다면, 콜스택 가장 상위인 A에게 에러를 던지기 위해서 B에서도 에러를 던지는 키워드인 throws를 붙여서 구현하는것이 바람직함
    • B에서 단순히 에러를 위로 토스하려면 try키워드만 붙여줌
func A() {
    do {
        try B()
    } catch {
        print(error)
    }
}

func B() throws {
    try C()
}

func C() throws {
    if Bool.random() {
        print("success")
    } else {
        throw MyErrorType.myError
    }
}

* 전체 코드: https://github.com/JK0369/ExRefactor10_6

Comments