Swift에서의 오류 처리 (런타임 시간)
Closed this issue · 0 comments
EunHee-Jeong commented
분류
-
두 가지로 나뉜다.
-
Recoverable
(복구 가능한 종류)- 오류가 발생한 함수 내에서 반환하도록 하는 것
- 종류
- nil 또는 error enum case를 반환
- error 던지기
-
Non-recoverable
(복구 불능한 종류)- 사용하는 이유
- App 실행 중에 파일을 로드해야 하는 상황 → 만약 파일이 없다면 ?? ⇒ 계속 실행하는 것보다 프로그램을 크래시 시키는 것이 낫다…
- 종류
- assert(), assertFailure()
- precondition()
- fatalError()
- exit()
- 사용하는 이유
-
특징
Recoverable
-
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() } }
- 가장 간단한 형태임
- 많은 상황(특히 비동기 작업을 처리하는 경우…)에서 유용한 방법이지만, 잘못된 호출이 계속해서 생성될 수도 있기 때문에 적당히 사용해야 한다고 함
-
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
-
assert(), assertFailure()
- 특정 조건이 true인지를 검증할 때 사용함
- DEBUG 빌드 시 크래시를 발생시킴 (RELEASE 빌드에서는 무시됨)
- 일종의 런타임 강력 경고라고 볼 수 있음
-
precondition(), preconditionFailure()
guard let config = FileLoader().loadFile(named: "Config.json") else { preconditionFailure("Failed to load config file") // 파일이 누락되었다면, 실행을 종료시킴 }
- DEBUG, RELEASE 빌드 모두에서 크래시를 발생시킴 (= 검증됨)
- 즉, 조건을 만족하지 못한다면 절대로 다음 루틴을 실행하지 않음
-
exit()
- 프로세스를 종료시킴