[Swift] 에러 처리 (Error Handling)

팔랑이·2023년 6월 9일
post-thumbnail

23-04-25

함수 실행 도중 에러상황이 발생하면 이에 적절히 대응해야 하는데, 이를 에러 처리(Error Handling)라고 한다.

옵셔널과 달리, 에러 핸들링은 실패의 원인을 결정할 수 있게 하고, 필요하다면 프로그램의 다른 부분에도 에러를 전파할 수 있게 한다.

함수가 에러상황을 마주치면 에러를 throw 한다. 그 함수의 호출자는 에러를 바로 catch할 수 있고 적절히 대응할 수 있다.

func canThrowAnError() throws {
    //this function may or may not throw an error
}

선언문의 throw 키워드를 통해 에러를 throw할 수 있다. 에러를 throw하는 함수를 호출할 때 표현식 앞에 try 키워드를 붙일 수 있다.

Swift는 catch문으로 조절되기 전에 현재 범위 밖으로 자동적으로 에러를 확산시킨다.

do {
    try canThrowAnError()
    // no error was thrown
} catch {
    // an error was thrown
}

do문은 하나 이상의 catch문으로 에러가 전파되도록 하는 new containing scope를 만든다.

밑은 각각 다른 에러조건에서 에러를 처리하고 대응하는 예시이다.

func makeASandwich() throws {
    // . . .
}

do {
    try makeASandwich()
    eatASandwich()
} catch SandwichError.outOfCleanDishes {
    washDishes()
} catch SandwichError.missingIngredients(let ingredients) {
    buyGroceries(ingredients)
}

이 예제에서, clean dishes가 없거나 어느 ingredients가 없으면 makeASandwich() 함수는 에러를 throw 할 것이다. 그렇기 때문에, 함수의 호출은 try 표현식으로 wrapped되어야 한다. do문으로 함수를 호출하면, throw되는 어떤 함수든 catch절에 전파될 것이다.

만약 아무 에러도 throw되지 않는다면, eatASandwich() 함수는 호출될 것이다. 만약 에러가 발생했을 시 에러상황이 SandwichError.outOfCleanDishes 상황과 맞는다면, washDishes() 함수가 호출될 것이다. 만약 에러상황이 SandwichError.missingIngredients 상황과 맞는다면, catch 패턴이 captured된 [String]값과 함께 buyGroceries(_;)함수가 호출될 것이다.


플젝 할때 더 깊이 이해하는걸로...

🌏 참고사이트
Swift Language Guide

profile
정체되지 않는 성장

0개의 댓글