본문 바로가기
Swift

오류 처리

by JDeoks 2024. 3. 10.

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