[Swift] 스위프트의 오류처리

jae·2024년 11월 19일

swift

목록 보기
4/14

스위프트에는 옵셔널이라는 개념도 존재하고
try catch면 끝!이 아니기에 이에 대해 정리를 해보고 가는 것이 좋을것같아서
급하게 정리하고 넘어가도록 하겠다!

에러 정의 Error 프로토콜

속성이나 메소드를 요구하지 않고 에러를 표현하는 타입을 만들기 위한 기본 프로토콜

enum inError: Error {
    case invalidError
    case networkError(code: Int)
    case unknown
}

열거형을 통해 에러를 정의할때 Error 프로토콜을 이용하고

func performTask(input: Int) throws {
    if input < 0 {
        throw inError.invalidError
    }
}

throws 키워드를 통해 throw로 에러를 던질수있다

LocalizedError 같은 추가 프로토콜을 가져오면 에러메세지를 만들수도 있다.

enum inError: Error, LocalizedError {
    case fileNotFound
    case invalidData
    
    var errorDescription: String? {
        switch self {
        case .fileNotFound:
            return "The requested file was not found."
        case .invalidData:
            return "The data is invalid or corrupted."
        }
    }
}

RecoverableError 를 이용하면 오류가 났을떄 복구 옵션을 제시하거나 복구 작업을 시도할 수 있는 기능을 제공

try를 사용하는 방법

try

do {
	try 에러를 던질 수 있는 함수를 호출
}catch {
 // 오류 시 동작할 로직
}

try를 호출하게 된다면 에러를 던질 수 있는 함수를 호출해야하며
꼭 do~catch와 같은 에러를 체크하는 로직이 필요하다
없을 경우 컴파일러가 에러를 처리하지 않았다는 경고를 보인다

try?

옵셔널 형태의 try?는 nil 혹은 정상값을 반환하는데 에러처리가 꼭 필요하지 않을때나 가볍게 오류처리를 하고 싶을때 사용한다

try!

강제 실행으로 오류가 나지않을거라하며 실행을 요구하는데
꼭 안전한 경우에만 사용을 해야한다

catch

do~ catch를 하게 되면 do 부분에서 실행하던 로직에 에러가 발생하면 catch 블록에서 처리를 해주기에 프로그램은 실행이 중지되지않는다

do {
    try (오류를 던질 함수)
} catch 열거형 오류의 특정 종류 {
    print("Invalid input error occurred.")
} catch {
    print("An unknown error occurred: \(error)")
}

이렇게 캐치를 쓰게되면 특정 오류 조건마다 어떤 방법을 쓸지 설정이 가능하다.

LocalizedError 같은 프로토콜이 필수가 아니라 옵션 같은 이유는
이렇게 catch를 통해 오류별 처리 방법들을 설정할수도 있기때문인데
추가적인 설명이나 메시지를 제공하려면 LocalizedError를 활용해야 할 필요도 있기에 기억해두어도 좋을 것 같다.

0개의 댓글