예외처리

김윤홍·2024년 6월 16일
post-thumbnail

실패가능 상황과 예외처리

프로그램에서 에러가 발생한 상황에 대응하는 과정이다
swift에서 런타임 에러가 발생한 경우, 처리를 지원하는 클래스가 있다.
프로그램에서 모든 기능이 원하는대로 동작한다는 보장이 없기 떄문에 이에 대한 조치와 대응을 해야한다

Error

Error는 던져질 수 있는 오류 값을 나타내는 유형
Error프로토콜을 채택하여 사용자 정의 에러를 정의하여 사용할 수 있다.

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

throws와 do-catch문

throws는 리턴 값을 반환하기 전에 오류가 밠ㅇ하면 여러 객체를 반환한다는 의미이다.
오류가 발생할 구간에 사용하자 throw로 던진 에러를 do-catch에서 처리한다

throw, do-catch문 예시

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리턴 반환시 optional타입

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)

0개의 댓글