본문 바로가기
Swift

[Swift] 오류처리 (Error Handling)

by Sky Titan 2021. 1. 28.
728x90
스위프트 프로그래밍
국내도서
저자 : 야곰
출판 : 한빛미디어 2019.10.01
상세보기

오류처리 (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

댓글