일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- MVVM
- SWIFT
- tableView
- 클린 코드
- uiscrollview
- UITextView
- HIG
- Xcode
- 애니메이션
- collectionview
- map
- combine
- Human interface guide
- RxCocoa
- 리펙터링
- swiftUI
- swift documentation
- UICollectionView
- 스위프트
- Observable
- Refactoring
- Clean Code
- ribs
- uitableview
- clean architecture
- ios
- 리펙토링
- 리팩토링
- rxswift
- Protocol
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[swift] 12. 예외 처리 (throws, throw, do - try - catch) 본문
1. 예외 처리
필요한 이유
- optional타입은 오류가 발생했을 때 오류에 대한 정보를 외부로 전달할 방법이 없음
2. 구현 방법
- 함수가 반환할 오류는 일관된 주제와 연관된 경우(문자열이 있을 때, 문자열 크기, 문자열 형식, 문자열 포멧형식 등의 체크)
- 일관된 주제를 표현하기에 가장 좋은 것은 enum형 타입
1) enum에 오류타입명 정의
// enum형으로 error타입명 정의 ( 프로토콜을 구현한 것은 오류 타입으로 사용하라는 일종의 가독성 표시 )
enum DateParseError : Error {
case overSizeString
case incorrectData(part: String)
}
2) 오류가 나는 조건을 명시 : throws와 throw로 선언
- 오류가 발생할 수 있다는 것 표현 : throws를 "->"앞에 표시(반환 전에 오류가 발생하면, 오류객체를 반환한다는 의미)
- 오류가 발생됐다는 표현 : throw와 오류명 집어넣기(return하는 것과 유사)
// 오류가 나는 조건을 throws와 함께 배치
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
}
3) do - try - catch로 접근
- 마지막 catch에 <오류타입>을 작성하지 않으면 default문으로 됨
- try! : 함수 강제 실행 (런타임 오류 발생 가능)
- try? : 에러가 발생하면 nil리턴, 발생하지 않으면 Optional타입으로 리턴
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이므로 오류입니다.
<전체 코드>
// enum형으로 error타입명 정의
enum DataError : Error { // Error 프로토콜을 구현한 것은 오류 타입으로 사용하라는 일종의 가독성 표시
case overSizeYear
case incorrectData(part: Int)
}
// 오류가 나는 조건을 throws와 함께 배치
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
}
// 실제로 응용프로그램에서 불러올 함수
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이므로 오류입니다.
※ 오류가 나는 조건은 따로 함수로 작성(throws, throw)
오류를 처리하는 구문은 직접 함수를 이용하는 곳에서 처리 (do - try - catch)
3. try, try! try? 차이
- try : 예외 발생시 catch로 예외 정보 던지며, 성공하는 경우 un wrapping된 값 반환
- try? : 예외 발생시 nil 리턴, 성공하는 경우 옵셔널 값 반환
- try! : 예외 발생시 runtime error, 성공하는 경우 unrapping된 값 반환 (nil값이 나오지 않음을 확신하는 경우 사용)
'swift 5 문법' 카테고리의 다른 글
[swift] 14. 접근 제한자(private, fileprivate, internal, public, open) (0) | 2020.04.18 |
---|---|
[swift] 13. 초기화(init, convenience init, required init, override init) (0) | 2020.04.17 |
[swift] 11. 프로토콜 (protocol) (0) | 2020.03.29 |
[swift] 10. 열거형과 익스텐션 (0) | 2020.03.29 |
[swift] 9. 상속 및 다운캐스팅 (0) | 2020.03.28 |