[Swift] 에러처리 (Error Handling)

Kio·2021년 12월 5일
0

Swift

목록 보기
5/14
post-thumbnail

지난 포스팅에서 컴파일 오류, 런타임 오류에 대해 가볍게 다루어보았는데, 오늘은 그 오류를 처리하는 방법에 대해 알아보고자 합니다.



에러(Error) 종류

  • Compile Time Error
    - 문법과 관련. 코드가 잘못됨을 알려준다.

  • Runtime Error
    - 프로그램이 실행되는 동안 발생하며, 코드가 잘못되어 있지 않더라도, device, resource 상태에 따라 error가 발생할 수도 있다.

더 알고 싶으시다면 아래 링크를 참고해주세요 👻
컴파일 오류 VS 런타임 오류



에러처리(Error Handling) 하는 이유

  • 코드를 짜거나 프로그램을 실행하다보면 다양한 이유로 컴파일 에러, 런타임 에러 등의 다양한 에러(Error)가 발생합니다.
  • 프로그램이 매번 우리가 원하는 방향으로 되지 않을 수 있기 때문에, 에러가 발생하면 어떻게 처리할지를 결정해주는 것이 에러처리(Error Handling) 입니다. 쉽게 말해, 예외사항을 처리하는 거라고 할 수 있습니다.


에러처리(Error Handling) 하는 방법

에러처리를 위해서는 다음과 같은 3 step이 필요합니다.

1. 에러 타입 정의

  • Error 프로토콜을 새로운 Error 열거형 타입을 정의 합니다.
  • 저는 맥도날드 주문 에러 타입을 정의해볼게요.
enum McDonaldOrderError: Error {
     case invalidSelection
     case LackOfMoney
     case outOfStock
}

2. 에러를 발생시키는 함수 정의

먼저 Hamburger 구조체를 생성

struct Hamburger {
    var name: String
    var price: Int
    var count: Int
}

현재 저의 잔액을 현재 4000원으로 설정

let myMoney = 4000

throws 키워드를 이용하여 에러를 발생시키는 함수를 정의하고,
에러가 발생하면 에러를 던질 곳에 throw를 위치시킵니다.

func OrderMcDonaldMenu(orderedMeun: Hamburger) throws {
    if orderedMeun.name != "BigMac" {
        throw McDonaldOrderError.invalidSelection
    }
    if orderedMeun.price > myMoney {
        throw McDonaldOrderError.LackOfMoney
    }
    if orderedMeun.count == 0 {
        throw McDonaldOrderError.outOfStock
    }
}

3. Do-Catch를 이용하여 에러 처리하기

주문하고 싶은 햄버거를 변수로 먼저 만들어보았습니다.

let bigMac = Hamburger(name: "BigMac", price: 4600, count: 3)

그리고 주문이 가능한 지 do-catch 문을 통해 확인해볼건데요.

  • do문 내에서 try 키워드를 통해 던진 오류를 받을 수 있습니다.
  • catch문 내에서는 던진 오류를 어떻게 처리할 건지를 정의합니다.
do {
    try OrderMcDonaldMenu(orderedMeun: bigMac)
} catch McDonaldOrderError.invalidSelection {
    print("저희 매장에 주문한 메뉴가 없습니다. 메뉴이름을 다시 확인해주세요.")
} catch McDonaldOrderError.LackOfMoney {
    print("메뉴를 주문하기에 고객님의 잔액이 부족합니다.")
} catch McDonaldOrderError.outOfStock {
    print("현재 재고가 없어 주문이 불가능합니다.")
}

결과는...?

제가 가진 돈으로는 빅맥을 사먹을 수 없기에 위와 같은 결과가 나왔네요ㅠㅜ
600원 이나 부족하기 때문이죠😭

let myMoney = 4000
let bigMac = Hamburger(name: "BigMac", price: 4600, count: 3)

이처럼 에러처리 (Error Handling) 을 통해 예외상황이 발생했을 때,
어떻게 대처하면 좋을지를 지정하여 오류를 대비할 수 있습니다.



알면 좋은 추가 키워드

  • rethrows
    - 이 키워드는 저도 아직 어렵네요😭
  • defer
    - defer 는 어렵지 않으니 한번 찾아보시는 걸 추천드립니다👻


참고

[공식문서] The Swift Programming Language
[블로그] 오류처리 - yagom
[인프런] 앨런 Swift문법 마스터 스쿨

혹시 틀린 사항이 있다면 언제든 지적 부탁드립니다.

profile
Someday_iOS_Dev

0개의 댓글