→ Swift Study

[Swift] Do, Try, Catch 간단하게 알아보기

Swift librarian 2024. 2. 9. 23:11

Swiftdo, try, catch 구문은 에러 처리를 위한 구문이다. 보통 아래와 같은 형태를 많이 발견할 수 있다.

do { // 예외가 발생할 수 있는 코드를 포함하는 블록
    try //  예외가 발생할 수 있는 작업을 호출
} catch {
    // 예외가 발생했을 때 처리할 코드
}

 

코드 실습

아래와 같은 코드가 있다고 해보자. fetch 함수는 "Fetched" 를 반환하는 함수이다. 이 함수는 throws 를 통해 에러를 던지는 함수라는 것을 알 수 있다. isActive 를 받아서 false 면 에러를 던진다.

enum fetchError: Error {
    case unknown
    case network
}

func fetch(_ isActive: Bool) throws -> String {
    if isActive {
        return "Fetched"
    } else {
        throw fetchError.unknown
    }
}

 

위의 화면은 아래와 같은 코드로 구사할 수 있다. fetch 를 누르면 nilFetched 로 바뀐다.

import SwiftUI

struct ContentView: View {
    @State private var text: String?
    
    var body: some View {
        VStack {
            if let text = text {
                Text(text)
            } else {
                Text("nil")
            }
            
            // do try catch 를 사용하는 부분
            Button("fetch") {
                do {
                    text = try fetch(true)
                } catch  {
                    print("error: \(error.self)")
                }
            }
            .buttonStyle(.bordered)
        }
        .font(.largeTitle)
    }
}

 

하지만 text = try fetch(false) 가 되어 에러를 반환한다면?

내가 설정한 unknown 에러를 반환한다. 이 구문을 예외상황이 발생할 수 있는 곳에 활용하면 좋을듯 하다.

 

try?

try? 를 사용하게 된다면 에러와 상관없이 "Fetched" 를 반환하거나 nil 을 반환한다. 만약 아래와 같이 만든다면 error 가 나오지 않고 뷰에 아무 변화도 없게 된다.

struct ContentView: View {
    @State private var text: String?
    
    var body: some View {
        VStack {
            if let text = text {
                Text(text)
            } else {
                Text("nil")
            }
            
            Button("fetch") {
                text = try? fetch(false)
            }
            .buttonStyle(.bordered)
        }
        .font(.largeTitle)
    }
}