ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift - Error Handling(throws)
    Programming/Swift 2022. 3. 25. 15:28

     

    안녕하세요 BeePeach입니다 :)

     

    오늘은 Error Handling 중에서 throws에 대해서 조금 자세히 공부해보도록 하겠습니다.

     

    Error가 throw 됐다면 반드시 이 Error를 어떻게 다룰지에 대한 코드를 작성해야 합니다.

    다른 대안으로 시도해본다던지 사용자에게 실패에 대한 정보를 준다던지와 같이 말이죠.

    이러한 것을 Error를 handling한다고 표현합니다.

    에러를 다룬다?? 해석하기 애매하니 에러를 핸들링한다라고 표현하겠습니다.

     

    Swift에서 에러를 다루는 방법에는 4가지가 있습니다.

     

    1. Error를 propagate(전파)하는 방법

    2. do-catch문을 사용하는 방법

    3. Optional try를 사용하는 방법

    4. assert를 이용하여 에러를 발생시키지 않는 방법

     

    여담으로 Swift의 에러 처리 방법은 대부분 언어들과 다르게 call-stack을 분리하는 작업이 포함되어 있지 않습니다.

    이유는 이 작업이 무거운 작업이기 때문입니다.

    그래서 Swift의 throw문의 성능은 return문의 성능과 비슷하다고 합니다.

     

     


    try

     

    Error가 발생한다는 것은 우리가 원하던 흐름대로 흘러가지 않고 여러 문제로  프로그램의 흐름이 변하게 된다는 의미입니다.

    그러므로 Error가 발생할 수 있는 부분을 빠르게 식별할 수 있는 수단이 필요합니다.

     

    이전 포스팅에서 Error를 던질 수 있는 함수, 생성자, 클로저는 throws를 파라미터 뒤에 적어준다고 했었죠?

    그리고 이 throws가 포함된 함수, 메서드, 생성자, 클로저를 호출할 때는 반드시 호출문 앞에 try, try? try!중에 하나를 적어줘야 합니다.

    그래서 이전에 throws func를 그냥 호출했더니 컴파일 에러가 발생한 것입니다.

     

    try를 적어주면 쉽게 이 코드는 Error를 발생시킬 수 있는 코드구나! 라는것을 한눈에 파악할 수 있게 됩니다.

     

    그럼 이제 위에서 설명한 Error handling 방법 4가지를 살펴보도록 하겠습니다.

     

     


     

    Propagating Error

     

    Propagate이란 사전적인 의미로. 전파하다. 확산하다. 라는 의미를 가지고 있습니다.

    에러를 전파한다는 게 거창하게 들릴 수 있는데 이미 이전에 공부한 내용입니다.

     

    바로 throws 키워드를 가진 함수, 생성자, 클로저만이 Error를 전파할 수 있습니다.

    이전 포스팅에서 throws 키워드는 throw를 포함한 코드가 내부에 존재할 때 파라미터 뒤에 throws를 붙여서 이 함수가 Error를 던질 수 있다는 것을 나타내는 것이라고 설명했습니다.

     

    이 의미를 잘 생각해봅시다,

    throws를 포함한 함수는 Error를 발생시킬 수 있다. -> 이 함수를 호출하면 Error가 발생할 수 있다. -> Error가 전파된다.

    이런 흐름으로 이해할 수 있습니다.

     

    우리가 자주 접하는 음료자판기를 통해서 예시를 들어보겠습니다.

    이 예시는 Apple document의 예시를 살짝 바꿨습니다.

     

     

     

     

    VendingMachineError를 정의했습니다.

    Error의 종류는 자판기에 없는 종류일 때 발생하는 에러, 넣은 돈이 선택한 음료보다 적을 때 발생하는 에러, 선택한 음료의 재고가 없을 때 발생하는 에러 3가지가 있습니다.

     

     

     

     

    Item이란 struct를 정의한 뒤에 자판기 Vending Machine class를 정의했습니다.

    여기서 주의 깊게 볼 부분은 Vend(itemNamed:) 메서드입니다.

     

    각 상황에 맞춰서  

    존재하지 않는 음료라면 invalidSelection

    음료의 재고가 없다면 outOfStock

    넣은 동전보다 음료의 가격이 비싸면 insufficientFunds Error를 던지고 있습니다.

     

    그리고 모두 통과한다면 넣은 동전을 차감시키고 음료의 재고도 차감시키도록 했습니다.

    여기서 Error를 throw 하므로 이 메서드는 반드시 throws 키워드를 포함해야 합니다.

     

    그럼 여기서 Error를 전파한다는 의미는 또 다른 게 있을까요?

    바로 이 메서드를 호출하는 코드가 포함될 때 의미가 생깁니다.

     

     

     

     

    각각 좋아하는 음료를 dictionary로 선언했습니다.

     

    buyFavoriteDrink(client:vendingMachine:) 함수를 정의했습니다.

    그리고 이 함수 안에 Line 11에서 throws 메서드를 호출하고 있습니다.

     

    그럼 Error를 던질 가능성이 있는 코드이므로 반드시 호출문 앞에 try, try? try!를 사용해야합니다.

    아무것도 적지 않으니 이렇게 에러가 발생합니다.

    여기서는 try를 사용해보도록 하겠습니다.

     

     

     

     

    try를 적었는데도 에러가 발생합니다.

    여기서 Error를 throw하는데 handing하고 있지 않는다고 나옵니다.

     

    아직 우리는 try에 대해서 공부하지 않았습니다. 

    그런데 지금 우리가 살펴보고 있던 내용은 Propagating Error에 대한 내용입니다.

    이 부분을 다시 유념하고 설명을 이어가겠습니다.

     

    try를 무조건 do-catch 문에서 사용해야한다고 생각하는 분들이 있습니다.

    하지만 이는 조금 잘못된 설명입니다.

    이렇게 try를 do-catch와 같이 사용하지 않고도 에러없이 사용할 수 있습니다.

    지금은 에러가 발생하잖아?? 라고 생각하시겠지만 한가지만 추가해주면 됩니다.

    바로 우리가 지금 공부하고 있는  Propageting Error입니다.

     

    Error Handling이란 Error가 발생하는 코드에 대한 처리라고 했었죠??

    그런데 지금 try만 붙여주고 Error가 발생할 가능성이 있는 vend(itemNamed:) 메서드는 아무런 처리를 안하고 있습니다.

    이전에 3가지의 Error가 발생할 가능성이 있었는데 말이죠!

     

    여기서 Error Handling에 첫번째로 설명드린 Propagating Error를 이용하는겁니다.

    buyFavoriteDring(client:vendingMachine:) 함수에서 발생할 Error에 대한 대안은 모르겠고 나도 Error를 throw 할 수 있어 나중에 여기서 호출할 코드에서 처리해

    하고 Error를 다시 넘겨주는것입니다.

     

     

     

     

    buyFavoriteDring(client:vendingMachine:) 함수를 정의할때 throws 키워드를 또 추가해주니 에러가 말끔하게 사라졌습니다.

     

    이렇게 Error를 전파하는것도 Error를 다루는 방법중에 하나입니다.

    그런데 이렇게 전파만 한다면 정작 Error가 발생한 부분에 대한 예외처리는 하지못합니다.

    마치 폭탄돌리기처럼 니가 처리해. 아니야 니가 처리해! 하는거와 같죠.

     

     


     

     

    그럼 이제 예외 처리를 하는 2가지 방법에 대해서 공부해보려고 했는데..

    생각보다 포스팅이 길어져서 try와 try? try!에 대해서는 다음 포스팅에서 다루도록 하겠습니다.

     


     

    참고자료 

     

    https://docs.swift.org/swift-book/LanguageGuide/ErrorHandling.html

     

    Error Handling — The Swift Programming Language (Swift 5.6)

    Error Handling Error handling is the process of responding to and recovering from error conditions in your program. Swift provides first-class support for throwing, catching, propagating, and manipulating recoverable errors at runtime. Some operations aren

    docs.swift.org

     

     

    https://kxcoding.com

     

    여러분의 새로운 도전을 응원합니다 | KxCoding

    Mastering SwiftUI 더 적은 코드로, 더 멋진 UI 만들기

    kxcoding.com

     

    728x90
Designed by Tistory.