안녕하십니까 공부하는 개발자 입니다.
오늘 포스팅은 에러처리 입니다.
⚙️Error Handler
Error Handler란 보통 error가 발생하면 프로그램이 다운되지만 예상되는 error를 처리한다면 다운되는 것을 막을 수 있도록 코드를 짜는 것을 말합니다.
Swift의 에러의 경우에는 크게 2가지로 나뉘어 집니다.
Compile Time Error : 주로 문법과 관련된 버그 컴파일러가 알려주는 간단한 정보로 처리가 가능합니다.
Runtime Error : 프로그램이 실행되는 동안 나오는 버그 디바이스나 리소스의 문제로 버그가 나올 수 있습니다.
에러처리는 기본적으로 3가지 방법이 있습니다.
1. do-catch Statements
2. try Expression + Optional Binding
3. hand over 핸드 오버의 경우에는 그냥 함수를 호출할때 처리함으로 이번에는 넘어가도록 하겠습니다.
⚙️do-catch Statements
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
enum DataParsingError: Error {
case invalidType
case invalidField
case missingRequiredField(String)
}
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
}
// Parsing
}
|
cs |
기본적인 setting입니다.
|
1
2
3
4
5
6
7
8
9
|
func handleError() throws{
do{
try parsing(data: ["name" : ""])
} catch DataParsingError.invalidType{
//위의 parsing함수의 두번째 guard문으로 에러가 발생했을때 들어오는 catch문
print("invalid type error")
}
}
|
cs |
함수안에서 error처리를 진행할 경우 모든 error에대한 정의를 해주어야 합니다.
handleError() throws라고 선언을 한다면 invlidType에러를 제외한 에러의 경우 handleError를 선언한 부분에다 에러를 던진다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
func handleError1() throws{
//두번째는 catch문만 패턴없이 사용하는 방법이다.
do{
try parsing(data: ["name" : ""])
} catch {
//error는 프로토콜이기 때문에 타입케스팅이 필요
if let error = error as? DataParsingError{
switch error{
case .invalidType:
print("invalid type")
default:
print("handle error")
}
}
}
}
|
cs |
⚙️try Expression + Optional Binding
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
enum DataParsingError: Error {
case invalidType
case invalidField
case missingRequiredField(String)
}
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
}
// Parsing
}
if let _ = try? parsing(data: [:]){
print("success")
}else{
print("fail")
}
|
cs |
try 에러를 던지는 함수는 try표현식을 사용해야 합니다.
optional try(try?)의 경우에는 에러의 경우 nil반환
forced try(try!)의 경우에는 런타임 에러가 발생합니다.