How to use Do, Try, Catch, and Throws in Swift | Swift 동시성 #1

Sung Daegyu·2024년 2월 28일
post-thumbnail

#1 How to use Do, Try, Catch, and Throws in Swift

do, try, catch, 그리고 throws가 비동기 프로그램을 구현하는 것은 아니지만, 앞으로 비동기 프로그램을 구현하면서 필수적으로 쓰게 될 문법 중 하나이다.

이 강의에서는 위 문법을 사용하는 방법을 알려준다.

1. Optional을 통해 에러 핸들링하기

  • getTitle() 함수가 optional을 return 할때, if let 구문 도는 guard 구문을 통해 오류를 다룰 수 있다.
let isActive: Bool = true
  
 func getTitle() -> (title: String?, error: Error?) {
   if isActive {
     return ("NEW TEXT!", nil)
   } else {
     return (nil, URLError(.badURL))
   }
 }

let returnedValue = getTitle()
    if let newTitle = returnedValue.title {
      self.text = newTitle
    } else if let error = returnedValue.error {
      self.text = error.localizedDescription
    }

2. Result을 통해 에러 핸들링하기

  • String과 Error를 옵셔널널 튜블로 묶는 대신에 Result이라는 타입을 사용하는 것.
  • Result은 제네릭 타입으로 결과값과 에러값을 명시해줘야 한다.
  • switch 구문을 통해 비교적 깔끔하게 에러를 처리할 수 있다. (.success, .failure)
func getTitle2() -> Result<String, Error> {
    if isActive {
      return .success("NEW TEXT!")
    } else {
      return .failure(URLError(.badURL))
    }
  }

let result = getTitle2()
    switch result {
    case .success(let newTitle):
      self.text = newTitle
    case .failure(let error):
      self.text = error.localizedDescription
    }

3. Do, Try, Catch, Throw 사용하기

  • do, try, catch 문은 다음처럼 세트입니다.
do {
	try `throwing expression`
} catch `pattern` {
	`statements`
}
  • throwing expression에는 에러를 낼 수 있는 구문을 넣습니다.
  • pattern은 에러를 말합니다.
  • statements는 앞의 pattern의 에러를 어떻게 처리할지에 대한 구문입니다.
func getTitle3() throws -> String {
    if isActive {
      return "NEW TEXT!"
    } else {
      throw URLError(.badServerResponse)
    }
  }

do {
	    let newTitle = try getTitle3()
	    self.text = newTitle
    } catch let error {
      self.text = error.localizedDescription
    }
  • manager.getTitle3()에서 에러가 발생한다면 (error를 throw한다면) 이하의 코드로 진행하지 않고 바로 catch 구문이 실행됩니다.

참고

Swiftful Thinking 강의
https://www.youtube.com/watch?v=p6q1RmYUsNU&list=PLwvDm4Vfkdphr2Dl4sY4rS9PLzPdyi8PM&index=1

profile
대규의 개발로그

0개의 댓글