Error:
오류를 표현하기 위한 기본 프로토콜.
Error
프로토콜을 채택하는 것 만으로도 해당 타입을 오류로 사용할 수 있게 된다.
enum
을 사용하는것이 일반적
enum DataParsingError: Error {
case invalidData
case missingRequiredField(String)
case dataCorrupted
}
missingRequiredField
옆의 (string)은 연관 값(Associated Values)으로, 열거형의 각 케이스에 추가적인 정보를 저장할 수 있게 한다.
struct ParsedData {
var name: String
}
func parseData(from dictionary: [String: Any]) throws -> ParsedData {
guard let name = dictionary["name"] as? String else {
// 연관 값을 사용해서 어떤 필드가 누락되었는지 표시할 수 있음
throw DataParsingError.missingRequiredField("name")
}
let parsedData = ParsedData(name: name)
return parsedData
}
throws:
함수 또는 이니셜라이저가 오류를 발생시킬 수 있음을 나타내는데 사용된다.
throws
키워드가 사용된 함수는 자신이 호출될 때 발생할 수 있는 오류를 직접 처리하지 않는다. 대신, 이 함수를 호출하는 코드가 오류를 처리하도록 한다.
func someFunctionThatMightThrow() throws -> ReturnType {
if someConditionIsNotMet {
// 오류 반환
throw SomeErrorType.someError
}
// 성공 시 반환값
return someValue
}
함수의 정의에 throws
를 추가하여 함수라 오류를 던질 수 있음을 명시한다.
이와 같이 명시된 함수는 try
와 같이 호출되어야 한다.
오류 처리:
do-catch:
do {
let data = try parseData(from: ["name": "John Doe"])
// 파싱이 성공적으로 완료되면, 여기에서 반환된 `data`를 사용하여 성공 로직을 실행.
print("Parsed data: \(data.name)")
} catch DataParsingError.missingRequiredField(let fieldName) {
print("Missing required field: \(fieldName)")
} catch DataParsingError.invalidData {
print("Invalid data provided")
} catch DataParsingError.dataCorrupted {
print("Data corrupted")
} catch {
// 그 외 모든 오류를 처리.
print("Unexpected error: \(error)")
}
do
블록 내에서 try
와 함께 오류를 발생시킬 수 있는 코드를 실행
catch
블록에서는 발생한 오류를 잡아내어 처리, 여러 catch
블록을 사용하면 다양한 오류 구분 가능
try?
와try!
는 do-catch
처럼 오류를 세부적으로 처리할 필요가 없을 때, 단순히 발생 여부만을 판단하고 싶을 때 사용한다.
try?:
호출된 함수에서 오류가 발생할 경우 해당 함수는 nil
을 반환.
즉, 오류가 방생해도 크래시가 발생하지 않고, 대신에 nil
을 통해 오류 처리 가능
if let result = try? someThrowingFunction() {
// 오류 없이 실행된 경우의 처리
} else {
// 오류 발생 시의 처리
}
함수가 원래 옵셔널 타입을 반환하고, try?
를 사용하여 오류가 발생할 경우 반환한 nil
이 오류로 인한 nil
반환인지, 함수 자체의 정상동작으로 인한 nil
반환인지 구분할 수 없다.
try!:
오류가 발생하지 않을 것이라고 확신할 때만 사용
let result = try! someThrowingFunction()
'Swift' 카테고리의 다른 글
Codable, CodingKey (0) | 2024.03.13 |
---|---|
[RxGesture] 컨테이너 뷰와 내부 요소의 제스처 구분하기 (0) | 2024.03.02 |
@escaping (0) | 2023.10.19 |
클로저 - 캡쳐 (0) | 2023.10.17 |
클로저 (Closures) (2) | 2023.10.17 |