dev._.note

[Swift] 예외처리 본문

Dev/SWIFT

[Swift] 예외처리

Laena 2023. 12. 11. 21:16

📌 실패 가능한 상황과 예외 처리

에러처리

  • 프로그램에서 에러가 발생한 상황에 대응하고 이에 대응하는 과정.
  • Swift에서는 런타임에 에러가 발생한 경우, 이를 처리를 지원하는 클래스를 제공.

Error

  • enum VendingMachineError: Error {
        case invalidSelection
        case insufficientFunds(coinsNeeded: Int)
        case outOfStock
    }
    

📌 throws와 do-catch 문

throw와 throws

  • throws는 리턴 값을 반환하기 전에 오류가 발생하면 에러 객체를 반환한다는 의미.
  • throws는 오류가 발생할 가능성이 있는 메소드 제목 옆에 작성.
  • throw는 오류가 발생할 구간에서 작성.

 

throw로 던진 에러를 do-catch문에서 처리

// 표현
func canThrowErrors() throws -> String
func cannotThrowErrors() -> String
enum CustomError: Error {
    case outOfBounds
    case invalidInput(String)
}

func processValue(_ value: Int) throws -> Int {
    if value < 0 {
        throw CustomError.invalidInput("Value cannot be negative")
    } else if value > 100 {
        throw CustomError.outOfBounds
    }
    
    return value * 2
}

// do-catch 블록을 이용하여 throwing 함수 호출 및 에러 처리하기
do {
    let result = try processValue(50)
    print("Result is \\(result)")
} catch CustomError.outOfBounds {
    print("Value is out of bounds!")
} catch CustomError.invalidInput(let errorMessage) {
    print("Invalid Input: \\(errorMessage)")
} catch {
    print("An error occurred: \\(error)")
}
// 출력 : Result is 100

do {
    let result = try processValue(-10)
    print("Result is \\(result)")
} catch CustomError.outOfBounds {
    print("Value is out of bounds!")
} catch CustomError.invalidInput(let errorMessage) {
    print("Invalid Input: \\(errorMessage)")
} catch {
    print("An error occurred: \\(error)")
}
// 출력 : Invalid Input: Value cannot be negative

 


📌 try , try? , try!

try

  • 에러가 발생할 수 있는 코드 블록을 표시.
  • 에러를 던질 수 있는 함수나 메서드를 호출할 때 사용.
  • 해당 코드 블록에서 발생한 에러를 잡거나 처리 가능(do - catch문).

try?

  • do - catch 구문 없이도 사용이 가능.
  • 에러 발생시 nil값을 반환.
  • 에러가 발생하지 않으면 리턴 값의 타입은 옵셔널로 반환.

try!

  • 에러가 발생을 하면 앱이 강제 종료.
  • 반환 타입은 옵셔널이 언래핑된 값이 리턴.
  • 오류가 발생하지 않는다는 보장아래 사용.
  • enum MyError: Error {
        case invalidInput
    }
    
    func someThrowingFunction(value: Int) throws -> String {
        guard value >= 0 else {
            throw MyError.invalidInput // value가 음수인 경우 에러를 던짐
        }
    
        return "The value is \\(value)"
    }
    
    // throwing 함수 호출과 에러 처리하기
    do {
        let result = try someThrowingFunction(value: 5)
        print(result)
    } catch {
        print("Error occurred: \\(error)")
    }
    
    do {
        let result = try someThrowingFunction(value: -2) // 에러 발생
        print(result)
    } catch {
        print("Error occurred: \\(error)") // 음수 값을 처리하는 에러
    }
    
    // try?를 사용하여 에러 처리하기
    let result1 = try? someThrowingFunction(value: 5) // 유효한 값 호출
    print(result1) // Optional("The value is 5")
    
    let result2 = try? someThrowingFunction(value: -2) // 에러 발생
    print(result2) // nil
    
    // try!를 사용하여 에러 처리하기
    let result3 = try! someThrowingFunction(value: 5) // 유효한 값 호출
    print(result3) // The value is 5
    
    let result4 = try! someThrowingFunction(value: -2) // 에러 발생
    print(result4)
    
  • 참고 자료: The Swift Programming Language - Error Handling

'Dev > SWIFT' 카테고리의 다른 글

[Swift] 프로토콜(Protocol)  (0) 2023.12.13
[Swift] ARC(Automatic Reference Counting)  (0) 2023.12.12
[Swift] 클로저(Closure)  (0) 2023.12.10
[Swift] Guard문  (0) 2023.12.08
[Swift] 키오스크 과제  (1) 2023.12.07