
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