SMALL
예외처리
예외처리 방법에 대한 정리글 입니다.
실패 가능한 상황과 예외 처리
에러처리
프로그램에서 에러가 발생한 상황에 대응하고 이에 대응하는 과정을 이야기하며,
런타임에 에러가 발생한 경우, 처리를 지원하는 클래스를 제공
예외 처리를 통해 예외 상황을 구별하고 프로그램 자체적으로 오류를 해결하거나,
사용자에게 어떤 에러가 발생했는지 알려주는 등에 대한 조치와 대응에 관한 것을 알아봅시다.
Error
"Error"는 던져질 수 있는 오류 값을 나타내는 유형을 말합니다.
"Error" 프로토콜을 채택하여 사용자 정의 에러를 정의하여 사용할 수 있습니다
// Error 간단 예시
enum VendingMachineError: Error {
case invalidSelection // 잘못된 선택을 한 경우의 에러
case insufficientFunds(coinsNeeded: Int) // 충분한 돈이 들어오지 않았을 경우의 에러
case outOfStock // 재고가 없는 경우의 에러
}
throw(s)와 do-catch 문과 try문
"throws" 는 리턴 값을 반환하기 전에 오류가 발생하면 에러 객체를 반환
오류가 발생 할 가능성이 있는 메소드 제목 옆에 써주고
"throw" 는 오류가 발생할 구간에서 작성하며
"throw"로 던진 에러를 do-catch문에서 처리
// throw(s) 예시문
// 표현
func canThrowErrors() throws -> String // canThrowErrors() 라는 함수가 있을 때 throws 에러를 던지다 라는 키워드를 사용하여 에러 던짐을 표현
func cannotThrowErrors() -> String // 에러를 던지지 않는 함수라면, throws없이 일반적인 함수의 형태로 작성
// throw(s) 예시
enum CustomError: Error { // Error 라는 프로토콜을 채택하여 Error를 정의
case outOfBounds
case invalidInput(String) // invalidInput의 케이스는 String값을 연관값으로 갖고 있다는 의미입니다.
}
func processValue(_ value: Int) throws -> Int { // processValue 함수는 value 라는 Int 파라미터를 받아 Int를 리턴을 해주는데 에러도 throws를 해줄 수 있습니다.
if value < 0 {
/*
함수가 종료될 때에는 throws를 만나거나 return을 만나면 함수가 종료가 됩니다.
throws를 사용하기위해선 반드시 함수 내외부에 throws를 써 주어야 합니다.
파라미터 value가 0보다 작을 때 CustomError.invalidInput의 에러를
throws -> Int 이 구간의 throws로 던져 줍니다.
value가 100을 초과 하면 CustomError.outOfBounds를 던져 줍니다.
그래서 0에서 100사이의 value만 정상적으로 value의 2가 곱해져서 return이 됩니다.
*/
throw CustomError.invalidInput("Value cannot be negative")
} else if value > 100 {
throw CustomError.outOfBounds
}
return value * 2
}
// do-catch 블록을 이용하여 throwing 함수 호출 및 에러 처리하기
do { // do에는 에러가 발생할 수 있는 구문을 작성 해주면 됩니다.
let result = try processValue(50) // 에러를 발생할 수 있는 가능성을 내포함 -> try(시도한다)를 반드시 써주어야 합니다.
print("Result is \(result)") // try 했을 때 이 구문이 실행 에러가 나올경우 catch속성으로 에러를 잡아줍니다.
} catch CustomError.outOfBounds { // 100이 초과한 경우
print("Value is out of bounds!") // 100초과의 관한 에러 출력
} catch CustomError.invalidInput(let errorMessage) { // 0 미만의 값의 경우
print("Invalid Input: \(errorMessage)") // 0 미만의 관한 에러 출력 == 위 String으로 들어온 연관 값이 출력
} catch {
print("An error occurred: \(error)") // 그외의 에러 구문의 출력
}
// 출력 : Result is 100
do {
let result = try processValue(-10)
print("Result is \(result)")
} catch CustomError.outOfBounds {
print("Value is out of bounds!")
} catch CustomError.invalidInput(let errorMessage) {
print("Invalid Input: \(errorMessage)")
} catch {
print("An error occurred: \(error)")
}
// 출력 : Invalid Input: Value cannot be negative
try , try? , try!
try
에러가 발생할 수 있는 코드 블록을 표시
에러를 던질 수 있는 함수나 메서드를 호출할 때 사용
해당 코드 블록에서 발생한 에러를 잡거나 처리가능 (do - catch문)
try?
"do - catch" 구문 없이도 사용가능
에러 발생시 "nil"값을 반환
에러가 발생하지 않으면 리턴 값의 타입은 옵셔널로 반환
try!
에러발생시 앱이 강제 종료
반환 타입은 옵셔널이 언래핑된 값이 리턴
오류가 발생하지 않는다는 보장아래 사용
// try , try? , try! 예시
enum MyError: Error { // Error 프로토콜 채택
case invalidInput
}
func someThrowingFunction(value: Int) throws -> String { // Int 타입의 파라미터 value를 받아 String을 리턴해주는데 throws를 던질수도 있습니다.
guard value >= 0 else { // value가 0 이상이라면 guard문을 탈출해서 return이 실행이 되며, 0보다 작을 경우엔 invalidInput의 에러가 던져집니다.
throw MyError.invalidInput // value가 음수인 경우 에러를 던짐
}
return "The value is \(value)"
}
// throwing 함수 호출과 에러 처리하기
do { // do catch 문에서는 try 사용가능
let result = try someThrowingFunction(value: 5) // value: 5를 넣으면 MyError.invalidInput에 걸리지 않고 바로 return문으로 옵니다.
print(result)
} catch {
print("Error occurred: \(error)")
}
do {
let result = try someThrowingFunction(value: -2) // 에러 발생
print(result)
} catch {
print("Error occurred: \(error)") // 음수 값을 처리하는 에러
}
// do catch를 사용하지 않는 방법들
// try?를 사용하여 에러 처리하기
// try?을 사용하면 결과 값이 옵셔널로 저장이 됨, 에러 발생시 nil이 저장됨
let result1 = try? someThrowingFunction(value: 5) // 유효한 값 호출
print(result1) // 결과 : Optional("The value is 5")
let result2 = try? someThrowingFunction(value: -2) // 에러 발생
print(result2) // 결과 : nil
// try!를 사용하여 에러 처리하기
// !를 사용하면 에러가 나지 않는다면 옵셔널이 언래핑되어 저장, 에러가 난다면 에러만 발생합니다.
let result3 = try! someThrowingFunction(value: 5) // 유효한 값 호출
print(result3) // The value is 5
let result4 = try! someThrowingFunction(value: -2) // 에러 발생
print(result4)
728x90
'IOS > Swift-Study' 카테고리의 다른 글
[Swift-Study] 심화 문법종합반 2주차 4일차 정리 - 프로토콜 (0) | 2024.03.27 |
---|---|
[Swift-Study] 심화 문법종합반 2주차 4일차 정리 - ARC와 메모리 누수 (0) | 2024.03.26 |
[Swift-Study] 심화 문법종합반 2주차 3일차 정리 - 고차함수 (0) | 2024.03.25 |
[Swift-Study] 심화 문법종합반 2주차 2일차 정리 - 클로저 (0) | 2024.03.22 |
[Swift-Study] 심화 문법종합반 2주차 2일차 정리 - 접근제한자 (0) | 2024.03.12 |