728x90
|
오류처리 (Error Handling)
- 프로그램이 오류를 일으켰을 때 감지하고 회복하는 과정
오류 표현
- Error 프로토콜을 준수하는 타입의 값으로 표현됨
- 주로 열거형으로 Error 프로토콜 채택
enum ComputerError: Error {
case lackMemory
case cpuOverwork
case lackPower
}
오류 포착 및 처리
1. 함수에서 발생한 오류를 해당 함수를 호출한 코드에 알리기
- try 키워드로 던져진 오류를 받는다.
- try, try?, try! 존재
- throws 키워드를 함수 매개변수 뒤에 사용해서 오류를 던진다.
- throw 키워드를 이용해서 함수내부에서 발생한 오류를 던진다.
import Foundation
enum ComputerError: Error {
case lackMemory
case cpuOverwork
case lackPower
}
func doWorkOnComputer() throws {
try turnOnComputer()
}
func turnOnComputer() throws {
if currentPower < 50 {
throw ComputerError.lackPower
}
}
2. do-catch문을 이용해서 오류 처리
- do 절 내부에서 던진 오류를 catch가 받아서 처리
import Foundation
enum ComputerError: Error {
case lackMemory
case cpuOverwork
case lackPower
}
do {
try doWorkOnComputer()
} catch {
print(error)
}
func doWorkOnComputer() throws {
try turnOnComputer()
}
func turnOnComputer() throws {
if currentPower < 50 {
throw ComputerError.lackPower
}
}
3. Optional 값으로 오류 처리
- try? 을 사용해서 코드 실행 시 자동으로 옵셔널 값으로 변환되어 오류가 발생하면 nil값을 반환한다.
import Foundation
enum ComputerError: Error {
case lackMemory
case cpuOverwork
case lackPower
}
let result: Optional = try? doWorkOnComputer()
print(result)
func doWorkOnComputer() throws {
try turnOnComputer()
}
func turnOnComputer() throws {
if currentPower < 50 {
throw ComputerError.lackPower
}
}
4. try! 사용해서 처리
- 오류가 발생하지 않을 것이라고 확신할 때 사용
- 만약 오류가 발생하면 런타임 오류가 발생한다.
import Foundation
enum ComputerError: Error {
case lackMemory
case cpuOverwork
case lackPower
}
try! doWorkOnComputer()
func doWorkOnComputer() throws {
try turnOnComputer()
}
func turnOnComputer() throws {
if currentPower < 50 {
throw ComputerError.lackPower
}
}
5. 다시 던지기
- 하나 이상의 오류 발생 가능한 함수를 매개변수로 전달받았을 때 rethrows 키워드로 오류를 다시 던질 수 있다.
func doWorkOnComputer(callback: () -> Void) rethrows {
try callback()
}
6. defer구문으로 후처리
- 현재 코드 블록을 나가기 전에 꼭 실행해야하는 코드를 defer 구문으로 작성 가능
- error 처리 뿐만 아니라 다른 경우에도 사용 가능
- 오류 처리에 편리함
- 예를 들어 파일을 닫을 때 메모리에서 해제를 해야 정상적으로 닫을 수 있기에 defer 구문에서 메모리를 해제시킴
import Foundation
var now = 1
if now == 1 {
defer {
print("complete!")
}
print("now = \(now)")
}
for i in 0...5 {
defer {
print("go next")
}
print("now value is \(i)")
}
/* 결과 :
now = 1
complete!
now value is 0
go next
now value is 1
go next
now value is 2
go next
now value is 3
go next
now value is 4
*/
728x90
'Swift' 카테고리의 다른 글
[Swift] Equatable (0) | 2021.04.21 |
---|---|
[Swift] 요구 이니셜라이저 (Required Initializer) (0) | 2021.03.02 |
[Swift] 서브스크립트 (Subscript) (0) | 2021.01.17 |
[Swift] 접근제어 (Access Control) (0) | 2021.01.17 |
[Swift] 프로토콜 (Protocol) (0) | 2021.01.02 |
댓글