‼️⁉️ throws를 하는 함수를 사용하려면 무조건 앞에 try를 붙혀주어야된다.
// enum형으로 error타입명 정의
enum DataError : Error { // Error 프로토콜을 구현한 것은 오류 타입으로 사용하라는 일종의 가독성 표시
case overSizeYear
case incorrectData(part: Int)
}
// 오류가 나는 조건을 throws와 함께 배치 -> throw 문 추가
func getNextYearAndThrows(paramYear: Int) throws -> Int {
guard paramYear <= 2020 else {
throw DataError.overSizeYear
}
guard paramYear >= 0 else {
throw DataError.incorrectData(part: paramYear)
}
return paramYear+1
}
// 실제로 응용프로그램에서 불러올 함수 -> try do catch 문 사용
func getNextYear(paramYear: Int) -> Int {
var year: Int = 0
do {
year = try getNextYearAndThrows(paramYear: paramYear)
} catch DataError.overSizeYear {
print("년도 초과해서 입력하였습니다")
} catch DataError.incorrectData(let part){
print("입력한 값이 \(part)이므로 오류입니다.")
} catch {
print("default error catch")
}
return year
}
let a = getNextYear(paramYear: -999) // 입력한 값이 -999이므로 오류입니다.
import Foundation
enum StockError: LocalizedError {
case noCorrespondingFruit
case notEnoughToMakeJuice
case notEnoughToChange
var errorDescription: String? {
switch self {
case .noCorrespondingFruit:
return "일치하는 과일이 없습니다."
case .notEnoughToMakeJuice:
return "재료가 모자라요."
case .notEnoughToChange:
return "더 이상 변경할 수 없어요."
}
}
}
func tryError(if x: Int) throws {
if x == 0 {
throw StockError.noCorrespondingFruit
} else if x == 1 {
throw StockError.notEnoughToMakeJuice
} else {
throw StockError.notEnoughToChange
}
}
func catchError(if x: Int) {
do {
try tryError(if: x)
} catch {
print(error.localizedDescription)
}
}
catchError(if: 0) // 일치하는 과일이 없습니다.
catchError(if: 1) // 재료가 모자라요.
catchError(if: 2) // 더 이상 변경할 수 없어요.
enum DataParsingError: Error {
case invalidType
case invalidField
case missingRequiredField(String)
}
func parsing(data: [String: Any]) {
guard let _ = data["name"] else {
return
}
guard let _ = data["age"] as? Int else {
return
}
}
func parsing(data: [String: Any]) throws {
guard let _ = data["name"] else {
throw DataParsingError.missingRequiredField("name")
}
guard let _ = data["age"] as? Int else {
throw DataParsingError.invalidType
}
}
try? parsing(data: [:]) //nil
do {
try expression
statements
} catch pattern {
statements
} catch pattern where condition {
statements
}
do {
try parsing(data: [:])
} catch DataParsingError.invalidType {
print("invalid type error")
} catch {
print("handle error")
}
// 만약 pattern이 없을 경우 아래와 같은 방식으로 error handling을 자주한다.
func handleError() throws {
do {
try parsing(data: ["name":""])
} catch {
if let error = error as? DataParsingError {
switch error {
case .invalidType:
print("invalid type")
default:
print("handle error")
}
}
}
}
출처/참고 - https://babbab2.tistory.com/80