EunHee-Jeong/TIL

Swift에서의 오류 처리 (런타임 시간)

Closed this issue · 0 comments

분류

  • 두 가지로 나뉜다.

    1. Recoverable (복구 가능한 종류)

      • 오류가 발생한 함수 내에서 반환하도록 하는 것
      • 종류
        • nil 또는 error enum case를 반환
        • error 던지기
    2. Non-recoverable (복구 불능한 종류)

      • 사용하는 이유
        • App 실행 중에 파일을 로드해야 하는 상황 → 만약 파일이 없다면 ?? ⇒ 계속 실행하는 것보다 프로그램을 크래시 시키는 것이 낫다…
      • 종류
        • assert(), assertFailure()
        • precondition()
        • fatalError()
        • exit()

특징

Recoverable

  1. nil 또는 error enum case를 반환하는 경우

    class DataLoader {
        enum Result {
            case success(Data)
            case failure(Error?)
        }
    
        func loadData(from url: URL,
                      completionHandler: @escaping (Result) -> Void) {
            let task = urlSession.dataTask(with: url) { data, _, error in
                guard let data = data else {
                    completionHandler(.failure(error))
                    return
                }
    
                completionHandler(.success(data))
            }
    
            task.resume()
        }
    }
    • 가장 간단한 형태임
    • 많은 상황(특히 비동기 작업을 처리하는 경우…)에서 유용한 방법이지만, 잘못된 호출이 계속해서 생성될 수도 있기 때문에 적당히 사용해야 한다고 함
  2. error 던지기

    class StringFormatter {
        enum Error: Swift.Error {
            case emptyString
        }
    
        func format(_ string: String) throws -> String {
            guard !string.isEmpty else {
                throw Error.emptyString
            }
    
            return string.replacingOccurences(of: "\n", with: " ")
        }
    }
    • 호출한 곳에서 오류 처리를 해야하는 경우에 해당함
      • ex - 동기식 API인 경우 호출한 곳에서 오류를 처리하도록 강제하는 것.
    • do, try, catch 패턴을 사용함
    • 오류를 무시하려면 호출한 곳에서 try? 를 사용하면 됨

Non-recoverable

  1. assert(), assertFailure()

    • 특정 조건이 true인지를 검증할 때 사용함
    • DEBUG 빌드 시 크래시를 발생시킴 (RELEASE 빌드에서는 무시됨)
      • 일종의 런타임 강력 경고라고 볼 수 있음
  2. precondition(), preconditionFailure()

    guard let config = FileLoader().loadFile(named: "Config.json") else {
        preconditionFailure("Failed to load config file") // 파일이 누락되었다면, 실행을 종료시킴
    }
    • DEBUG, RELEASE 빌드 모두에서 크래시를 발생시킴 (= 검증됨)
    • 즉, 조건을 만족하지 못한다면 절대로 다음 루틴을 실행하지 않음
  3. exit()

    • 프로세스를 종료시킴

더 알아보기