예외 처리(Exception Handling)
예외 처리(Exception Handling)
발생한 오류 던지고 처리하기
💡 예외 처리(Exception Handling)
- 프로그램 실행 중 발생할 수 있는 예기치 않은 상황 또는 오류를 제어하는 메커니즘
→ 파일을 찾을 수 없음, 메모리 부족, 사용자의 잘못된 입력 등
- 예외 처리의 목적은 프로그램의 안정성을 유지하고 예외 상황이 발생했을 때 프로그램이 비정상적으로 종료되는 것을 방지하는 것
- 예외 상황을 구별하고 자체적으로 오류를 해결하거나, 사용자에게 어떤 에러가 발생했는지 알려주는 등에 대한 조치와 대응을 해야 함
- Swift에서는 런타임에 에러가 발생한 경우, 이를 처리를 지원하는 클래스 제공
예외 처리 정의
- Error 프로토콜을 채택하여 사용자 정의 에러를 사용할 수 있다.
예시
enum PhoneError: Error {
case unknown
case batteryLow(batteryLevel: Int)
}
try와 do-catch
- try 블록 안에서 예외가 발생할 수 있는 코드 실행
- 예외가 발생하면 실행이 중단되고, 해당 예외를 잡을 수 있는 catch 블록으로 이동
- catch 블록은 예외를 처리하고, 이후의 코드 실행을 계속할 수 있도록 함
기본 구문
do {
// 예외가 발생할 수 있는 코드
try expression
} catch pattern {
// 예외 처리
}
예시
파일을 열 때 발생한 예외
do {
let fileContents = try String(contentsOfFile: "example.txt")
print(fileContents)
} catch {
print("파일을 열 수 없습니다: \(error)")
}
throw와 throws
- 함수나 메서드 내에서 오류를 발생시키는 데 사용
- 오류를 발생시키면 프로그램의 제어가 호출한 곳으로 전달되고, 해당 오류를 처리할 수 있는 catch 블록이 있는 곳으로 이동
- 예외 상황이 발생했을 때 특정 오류를 던지기 위해 사용됨
기본 구문
func fetchDataFromServer() throws {
// 함수 내부 로직
if errorCondition {
throw NetworkError.connectionError
}
}
예시
간단한 오류 처리
enum CalculationError: Error {
case divisionByZero
}
func divide(_ dividend: Int, by divisor: Int) throws -> Int {
guard divisor != 0 else {
throw CalculationError.divisionByZero
}
return dividend / divisor
}
💡 발생한 오류 던지고 처리하기
※ 오류를 던진다 ▶ 오류를 처리해 주는 곳으로 전달해 준다
throws : 오류가 발생할 가능성이 있는 메소드 옆에 작성
func printNumber(_ number: Int) throws {} // void의 경우
func printNumber(_ number: Int) throws -> Int {} // 리턴타입의 경우
throw : 오류가 발생할 구간에 작성
func printNumber(_ number: Int) throws -> Bool {
let text = "숫자출력"
guard number > 0 else {
throw HttpError.badRequest
}
print("\(text): \(number)")
return true
}
예시
enum HttpError: Error {
case badRequest
case unauthorized
case forbidden
case notFound(_ errorPrint: String)
case requestTimeOut
case conflict
}
위 변수를 받는 케이스가 있다면 에러와 함께 값(String)을 넘겨줄 수 있음
→ 꼭 String이 아니어도 됨, 넘겨주고 싶은 값을 넘겨주면 됨
func printNumber(_ number: Int) throws -> Bool {
let text = "숫자출력"
guard number > 0 else {
throw HttpError.notFound("찾을 수가 없습니다.")
}
print("\(text): \(number)")
return true
}
※ throw로 예외를 던져주었다면 오류를 처리할 때에는 try와 do-catch로 처리할 수 있음
enum NetworkError: Error {
case connectionError
case timeoutError
case serverError
}
func fetchDataFromServer() throws {
let randomNumber = Int.random(in: 1...3)
// 예시를 위해 임의로 오류 발생
switch randomNumber {
case 1:
throw NetworkError.connectionError
case 2:
throw NetworkError.timeoutError
default:
throw NetworkError.serverError
}
}
do {
try fetchDataFromServer()
print("데이터를 성공적으로 가져왔습니다.")
} catch NetworkError.connectionError {
print("네트워크 연결 오류입니다.")
} catch NetworkError.timeoutError {
print("요청 시간이 초과되었습니다.")
} catch NetworkError.serverError {
print("서버에서 오류가 발생했습니다.")
} catch {
print("다른 오류가 발생했습니다: \(error)")
}
- 위 예시에서 fetchDataFromServer 함수를 호출하고 있음
→ 이 함수는 임의의 오류를 발생시키며 발생한 오류에 따라 다른 예외가 처리된다.
- fetchDataFromServer 함수는 throws 키워드를 사용하여 함수가 오류를 던질 수 있음을 나타내고 있음
→ 따라서 이 함수를 호출할 때에는 try 키워드를 사용해야 한다.
- do-catch 구문 내에서 try 블록 내에서 예외가 발생할 수 있는 코드를 실행하고 있음
→ 만약 예외가 발생 시 해당 catch 블록이 실행되며, 각 catch 블록은 발생한 특정 오류에 대한 예외 처리를 담당함
- 마지막 catch 블록은 모든 다른 오류에 대한 처리를 담당함
' 𝗔𝗣𝗣𝗟𝗘 > SWIFT : GRAMMAR' 카테고리의 다른 글
Swift 기초 문법 - 프로토콜(Protocol) (0) | 2024.03.14 |
---|---|
Swift 기초 문법 - ARC와 메모리 누수(Automatic Reference Counting) (0) | 2024.03.14 |
Swift 기초 문법 - 고차함수(higher-order function) (0) | 2024.03.13 |
Swift 기초 문법 - 클로저(Closure) (0) | 2024.03.13 |
Swift 기초 문법 - 접근 제한자(access control) (2) | 2024.03.12 |