Swift 오류 처리: throw, try, do-catch
Error와 throws로 오류를 정의하고 do-catch, try?, try!로 처리하는 방법을 비교합니다.

실패할 수 있는 함수를 성공하는 코드처럼만 작성하면 오류가 발생한 뒤의 흐름이 보이지 않는다. Swift는 throw와 try를 통해 실패 가능성을 호출부까지 드러낸다.
Throw
함수 내에서 특정 조건에 따라 에러를 발생시키기 위해 사용한다. 발생될 에러의 종류를 enum과 Error 프로토콜을 활용하여 먼저 정의한다.
enum MyError: Error {
case firstError
case secondError
}
함수가 에러를 던질 수 있다는 것을 throws를 통해 명시한다. 함수 내부에서 특정 조건에서 throw를 통해 에러를 던질 수 있다.
func someFunction() throws -> String {
// 에러 조건
if isSuccess {
return "Success!"
} else {
// 에러 던지기
throw MyError.firstError
}
}
throw를 통해 에러를 던지는 함수는 반드시 try를 통해 호출해야 한다.
Try, Do-Catch
throws 함수는 반드시 try를 통해 호출하고 throw로 던지는 에러에 대한 처리를 해야한다. 에러에 대한 처리는 do-catch문을 통해 catch 블럭에서 해야한다.
// try 키워드를 통해 에러를 던질 수 있는 함수 호출
do {
let result = try someFunction()
} catch MyError.firstError {
// 특정 에러 처리
} catch {
// 다른 에러 처리
}
에러의 종류에 따라 switch문을 통해 케이스별로 처리할 수 있다.
do {
let result = try someFunction()
} catch {
// 케이스별 오류 처리
switch error {
case MyError.firstError:
print("first")
case MyError.secondError:
print("second")
default:
print("default")
}
}
try?는 에러를 던지는 함수의 결과를 옵셔널로 감싸, 에러를 발생할 경우 nil로 반환한다. 때문에 do-catch문 없이도 사용할 수 있다.
// 에러가 발생할 경우 nil로 처리
let result = try? someFunction()
try!는 함수가 에러를 던지지 않을 것이라는 확신이 있을 때 사용하며, 만약 함수가 에러를 던지면 런타임 에러가 발생하고 프로그램이 종료되기 때문에 주의해야 한다.
// 에러가 발생할 경우 프로그램 종료
let result = try! someFunction()