[Swift] 예외처리

Daehyeon Yun·2025년 3월 9일
post-thumbnail

Swift의 예외처리는 어떻게 이루어질까?

struct Diff: View {
    
    @State var inputNumber = ""
    @State var resultNumber: Float = 0

    var body: some View {
        VStack{
            TextField("나눌 숫자를 입력하세요", text: $inputNumber)
            Text("나눈 결과는 다음과 같습니다. \(resultNumber)")
            Button{
                do { // 일단 아래의 코드를 실행하고
                    try resultNumber = devideTen(with: (Float(inputNumber) ?? 1.0))
                } catch DivideError.diviedByZero{ // 오류 발생시 특정 오류 캐치 (미리 정의한 에러)
                    print("0으로 나누었어요")
                    resultNumber = 0
                } catch { // 그 외의 오류
                    print("알수 없는 오류가 발생되었어요")
                }
            }label: {
                Text("나누기")
            }
        }
    }
    
    // throws를 명시한 함수 -> 문제가 발생할 가능성이 있는 함수임을 명시
    func devideTen(with inputNumber: Float) throws -> Float {
        var result: Float = 0
        if inputNumber == 0 {
            // error (오류 발생시 예외 던지기
            throw DivideError.diviedByZero
        }else{
            result = 10 / inputNumber
        }
        
        return result
    }
}

// 에러(예외)는 직접 정의할 수 있다.
enum DivideError: Error {
    case diviedByZero
}
  • 스위프트의 기본적인 예외 처리 시스템은 주로 아래의 키워드를 사용하여 오류를 처리한다.
    • throw, try, catch
    • 기본적인 구문은 다른 언어와 달리 아래와 같은 형식을 사용한다.
      • try-catch 가 아닌 do-catch 형식을 사용한다.
    • 스위프트는 try 키워드를 다양하게 사용할 수 있다.
      • try : 오류를 던질 수 있는 함수(throws가 명시된 함수)를 호출할 때 사용한다. → 이 경우 반드시 do-catch 구문으로 처리하거나 try? 혹은 try! 으로 처리해야한다.
      • try? : 만약, 함수에서 오류가 발생하면 nil을 반환한다. do-catch 구문을 정의할 필요 없이 간단하게 오류를 무시하고 nil을 반환시킬 수 있다.
        let result = try? divide(10, 0) // 오류가 발생하면 nil이 반환
      • try! : 함수 호출이 오류 없이 반드시 성공한다고 확신할 때 사용한다. → 만약, 오류가 발생하면 앱이 크래시된다. 💣
        let result = try! divide(10, 2) // 오류가 발생하지 않는다고 가정
  • 스위프트는 throws 를 활용하여 오류를 던질 수 있는 함수(오류가 발생할 가능성이 있는 함수)를 정의한다.
    // throws를 명시한 함수 -> 문제가 발생할 가능성이 있는 함수임을 명시
    func devideTen(with inputNumber: Float) throws -> Float {
        var result: Float = 0
        if inputNumber == 0 {
            // error (오류 발생시 예외 던지기
            throw DivideError.diviedByZero
        }else{
            result = 10 / inputNumber
        }
        
        return result
    }
  • 스위프트는 do-catch 를 활용하여 do 블록 내에서 오류가 발생할 수 있는 코드를 실행하고, catch 블록에서 이를 처리한다.
            Button{
                do { // 일단 아래의 코드를 실행하고
                    try resultNumber = devideTen(with: (Float(inputNumber) ?? 1.0))
                } catch DivideError.diviedByZero{ // 오류 발생시 특정 오류 캐치 (미리 정의한 에러)
                    print("0으로 나누었어요")
                    resultNumber = 0
                } catch { // 그 외의 오류
                    print("알수 없는 오류가 발생되었어요")
                }
            }label: {
                Text("나누기")
            }
  • 스위프트는 Error 프로토콜을 채택(Adopt)열거형을 통해 개발자가 직접 오류를 정의할 수 있다.
    • 정의된 오류는 자신이 만든 함수나 메서드에 던져 처리할 수 있다.

      → 즉, 기본 제공되는 예외들을 사용하지 않고도 개발자가 필요에 따라 오류를 정의하고 처리할 수 있다!

      enum MyError: Error {
          case divisionByZero
          case invalidInput
      }
      
      // MyError 열거형은 Error 프로토콜을 "채택" 한다.
    • 프로토콜 채택과 클래스 상속은 엄연히 다른 개념이니 유의하자.

profile
열심히 살아야지

0개의 댓글