Swift:
에러 처리하기
어떻게 하나요:
Swift는 do
, try
, catch
블록을 사용해 오류 처리를 합니다. 한번 살펴보겠습니다:
enum FileError: Error {
case fileDoesNotExist
case noPermission
}
func readFile(atPath path: String) throws -> String {
// 파일이 존재하는지, 그리고 읽기 권한이 있는지 검사하는 로직을 여기에 상상해보세요
let fileExists = false
let havePermission = true
if !fileExists {
throw FileError.fileDoesNotExist
}
if !havePermission {
throw FileError.noPermission
}
return "파일 내용은 여기에 있습니다"
}
do {
let fileContent = try readFile(atPath: "/path/to/file")
print(fileContent)
} catch FileError.fileDoesNotExist {
print("이런! 파일을 찾을 수 없습니다.")
} catch FileError.noPermission {
print("아! 파일을 읽을 권한이 없습니다.")
} catch {
print("알 수 없는 오류가 발생했습니다.")
}
샘플 출력:
이런! 파일을 찾을 수 없습니다.
깊게 들여다보기
오류 처리는 언제나 이처럼 매끈한 것은 아니었습니다. Objective-C에서는 NSError 객체에 대한 포인터를 다루며, 이는 다소 불편하게 느껴졌습니다. 이제 우리는 Swift 열거형(enum)과 Error
프로토콜로 더 우아한 시스템을 갖게 되었습니다.
Swift의 throw
를 통해 무언가 잘못되었다고 알릴 수 있습니다. do
블록은 오류 인식 영역으로 작동하고, try
접두사는 위험한 작업을 호출하며, catch
는 문제가 생겼을 때 처리합니다.
옵셔널은 실제 “오류” 상태까지는 아니지만 여전히 “결과가 없을” 수 있는 상황에 대한 대안입니다. 그것은 슈뢰딩거(Schrödinger)의 변수와 약간 비슷합니다 - 값이 있거나 없거나 둘 중 하나입니다.
진정한 깊이를 원한다면 정규 반환 패턴과 오류 패턴 사이의 세련된 하이브리드인 Result
타입을 살펴보세요.
또한 참조
- 공식 스위프트 오류 처리 가이드: Apple 문서
- 스위프트 오류 처리 모범 사례: RayWenderlich.com
- Swift에서의 고급 오류 처리: Medium 글