티스토리 뷰
Error Handling
에러 처리
프로그램 내에서 에러의 상태를 수신하고, 반응하여 처리하는 과정을 에러처리라고 합니다. 스위프트에서는 런타임 과정에서 회복가능한 에러를 처리하고, 전파하고, 반응하고, 던지는 것이 가능한 일급 객체(first-class)를 지원합니다.
우리가 항상 무언가 연산을 하려고 할때 그 연산이 반드시 성공할 것이라는 것을 보장할 수 없을 때가 있을 겁니다. 예를들면, 네트워킹작업이나 JSON파일 인코딩 디코딩 작업 등이 있겠지요. 이렇게 연산간 문제가 발생해서 반환하는 값 타입이 부재할 수도 있는데 이에 대비하여 존재하는것이 Swift의 옵셔널('?', Optional)이 되겠습니다.
하지만 옵셔널로 값이 부재함을 확인하는것 만으로는 에러를 처리하는데 부족할 수 있습니다. 해당 에러의 원인이 무엇이고, 이를위해 실행해야 하는 작업이 무엇이 있을지 판단하고 준비해야할 필요성이 있는 것이지요. 이때 필요한 것이 바로, 에러처리(Error Handling)입니다.
그 예시로, 디스크 상의 파일로부터 데이터를 처리해야하는 작업이 있다고 가정해봅니다. 이때 다양한 에러 발생 경우의 수가 존재합니다. 단순 예시를 생각해봐도 포맷이 잘못되었거나, 경로가 잘못되었거나, 해당 경로에 데이터가 없거나... 말이죠. 😂
이처럼 다양한 에러 상황에 대한 구별과 그에 맞는 처리를 하는 것은 에러에 적절히 대응할 수 있는 방법이 되겠습니다.
NOTE
스위프트의 에러처리는 Cocoa, Objective-C의 에러처리에 사용되는 NSError 클래스와 상호호환합니다. 이와 관련되서 관심이 있으시다면, Handling Cocoa Errors in Swift를 알아보시기 바랍니다.
Representing and Throwing Errors
에러 표현하고 던지는 방법
스위프트에서 에러는 Error프로토콜을 준수(채택)하는 값타입으로서 표현됩니다. 이러한 텅빈 프로토콜은 특정 타입에 대한 특정 에러가 발생할 수 있음을 가리키게 됩니다.
이때 Swift에서 지원하는 열거형 타입(Enumerations)는 다양한 경우의 에러에 대한 모델링에 딱 맞는 타입입니다. 열거형을 사용하면 연동자료를 인자로 받는 방식으로 발생할 수 있는 에러들에 대한 추가적인 정보까지 참고할 수 있습니다. 그 예시로, 아래는 특정 에러에 대한 다양한 케이스를 정의한 예시가 됩니다. 그 중 아래의 BasicError 열거형에서 정의한 케이스 중 insufficientFunds 에러는 coinNeeded 라는 인자를 갖고 있으며, 해당 에러가 발생할 때 에러 상황에 맞게 coinNeeded 값을 함께 설정할 수 있습니다.
Throwing an Error
에러 던지는 방법
에러를 던지는 것(Throwing an Error)는 특정 연산이 더이상 정상적으로 실행되기 어려울 때 실행되어 에러가 발생함을 가리키는데 사용합니다. 예를들면, 에러가 발생할 가능성이 있는 연산이 있을 경우 해당 메서드의 인자 정의부 뒤에 throws 예약어를 명시해 줍니다. 이는 에러가 발생할 수 있음을 의미하게 됩니다.
또한 해당 메서드의 에러가 발생하는 상황에 throw 키워드를 사용해서 해당 상황에 맞는 에러를 방출하도록 할 수 있습니다. 아래 코드는 throws를 명시한 메서드를 사용하는 예시를 보여줍니다.
canBuyItem 메서드는 throws를 명시했으며, 에러가 발생할 가능성이 있는 메서드입니다. 만약 에러가 발생할 케이스라면, throw {에러} 를 통해 특정 상황에 맞는 에러를 방출할 수 있으며, 해당 에러 케이스에 맞는 연동자료를 설정할 수 있다면 그 또한 가능합니다.
이러한 throws를 명시한 메서드를 do-try catch문 혹은 try? 등을 통해서 실행하고 예외처리를 수행할 수 있습니다. 그 예시는 아래와 같습니다.
위와 같이 do-try catch문을 통해서 에러 가능성이 있는 메서드를 실행할 수 있습니다.
만약 do문에서 연산 수행 간 에러가 발생한다면, catch 문에 진입하게 됩니다.
1) 위의 경우 첫번째 do-try catch문은 에러가 발생하지 않으므로, catch문은 진입하지 않고 do문 만으로 실행을 종료합니다.
2) 두번째 do-try catch문에서는 에러가 발생하므로 catch 문을 진입하게 됩니다. 이때 해당 에러케이스 맞는 연동자료가 인자값으로 전달된다면, 해당 인자값도 참조해서 그에 따른 에러처리를 수행할 수 있습니다. 위의 코드 실행 결과는 아래와 같습니다.
지금까지 스위프트의 Error Handling와 throws 메서드의 정의, do-try catch문을 통한 에러처리 방법을 알아봤습니다. 실제 실무에서는 불확실한 연산을 많이 사용하게 되는만큼, 이러한 예외 처리 방식에 대한 관심을 가져야 할 것 같습니다. 🤗
오늘은 여기까지입니다. 즐거운 하루 되세요 ^-^//
'iOS 개발 > 개발자문서 정보' 카테고리의 다른 글
Swift RandomAccessCollection 프로토콜 특징, 사용법 (0) | 2020.07.25 |
---|---|
Swift 문법, Extension 확장 역할 및 사용방법 (0) | 2020.07.21 |
스위프트 Opaque Types 1) 불투명타입의 필요성 (0) | 2020.07.19 |
Swift switch문 예약어, fallthrough 알아보기 (2) | 2020.07.18 |
Swift 문법 Closure 1) 일급객체, 클로져 알아보기 (0) | 2020.07.17 |
- Total
- Today
- Yesterday
- Collection
- 백준swift
- swift string
- Swift 알고리즘
- 알고리즘문제
- CoreML
- 프로그래머스swift
- uikit
- swift 문자열
- swift 기초
- 백준알고리즘
- Protocol
- swift알고리즘
- swift
- 자연어처리
- swift언어
- 스위프트
- 부스트코스
- 컬렉션
- 프로그래머스
- publisher
- 김프매매
- 개발자문서
- createML
- 프로토콜
- swift문제
- swift reduce
- ios
- 알고리즘
- SwiftUI
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |