출처 : Swift 에러 (Error) 처리, 예외 상황 다루기 (try, throws, defer 등) : 네이버 ...
enum ParseError : Error {
case OverSize
case UnderSize
case InvalidFormat(value : String)
case InvalidData(value : String)
}
예외발생
func parseTime(timeString : NSString) throws -> Time {
var retTime = Time(hour : 0, min : 0, sec : 0)
guard timeString.length == 8 else {
if timeString.length > 8 {
throw ParseError.OverSize
} else {
throw ParseError.UnderSize
}
}
if let hour = Int(timeString.substring(to: 2)) {
print(hour)
guard hour >= 0 && hour < 24 else {
throw ParseError.InvalidFormat(value: "시간")
}
retTime.hour = hour
} else {
throw ParseError.InvalidFormat(value: "시간")
}
if let min = Int(timeString.substring(with : NSRange(location : 3, length : 2))) {
print(min)
guard min >= 0 && min < 60 else {
throw ParseError.InvalidFormat(value: "분")
}
retTime.min = min
} else {
throw ParseError.InvalidFormat(value: "분")
}
if let sec = Int(timeString.substring(from : 6)) {
print(sec)
guard sec >= 0 && sec < 60 else {
throw ParseError.InvalidFormat(value: "초")
}
retTime.sec = sec
} else {
throw ParseError.InvalidFormat(value: "초")
}
return retTime
}
예외처리
func getPartTime(timeString : NSString, type : String) {
do {
let time = try parseTime(timeString : timeString)
switch type {
case "hour":
print("\(time.hour)시")
case "min":
print("\(time.min)분")
case "sec":
print("\(time.sec)초")
default:
print("입력값 배당 시간 정보 없음")
}
}
catch ParseError.OverSize {
print("입력 문자열이 깁니다.")
}
catch ParseError.UnderSize {
print("입력 문자열이 짧습니다.")
}
catch ParseError.InvalidData(let part) {
print("입력값의 \(part)에 해당하는 형식 오류")
}
catch ParseError.InvalidFormat(let part) {
print("입력값의 \(part)에 해당하는 값 오류")
}
catch {
print("알 수 없는 오류")
}
}