-
Swift - Error Handling 기초Programming/Swift 2022. 3. 24. 20:14
안녕하세요! BeePeach입니다 :)
에러가 발생할 때 매번 우리가 만든 앱이 종료된다면 별점 테러를 받고 사용자들이 다 떠나가겠죠??
프로젝트를 진행하는데 있어서 에러 처리는 매우 중요한 부분 중에 하나입니다.
그래서 오늘은 Error에 대해서 공부를 해보도록 하겠습니다.
참고로 이 포스팅에서 다룰 내용은 Runtime에 발생하는 에러에 관한 내용입니다.
Compiletime에 발생하는 에러는 컴파일시점에 에러에 관해 알 수 있기 때문에 비교적 쉽게 처리할 수 있습니다.
어떠한 작업들은 항상 성공한다는 보장이 없습니다.
예를 들어서 disk에서 파일을 가져오는 작업에서 여러가지 실패할 수 있는 상황들이 존재합니다.
해당 path에 파일이 존재하지 않는 경우, 파일 읽기 권한이 없는 경우, 파일을 원하는 포맷으로 인코딩할 수 없는 경우 등등 여러 가지가 존재합니다.
꼭 disk에서 파일을 가져오는 경우가 아니더라도 이러한 상황은 무수히 많습니다.
Swift에서는 이러한 여러가지 Error를 처리하기 위해서 Error를 throw하고 do-catch문을 이용해서 Error를 처리하거나 try? try!를 이용하여 에러를 처리합니다.
그럼 먼저 가장 기본적인 Error란 무엇인지부터 보고 넘어가겠습니다.
Error
Swift에서 Error는 Error 프로토콜을 채용한 타입의 값으로 나타냅니다.
Error 프로토콜을 살펴보면 요구사항이 하나도 없습니다.
이 프로토콜을 채용하면 어떠한 타입이든 해당 타입은 Swift Error Handling System에서 Error를 나타내는데 사용할 수 있게 됩니다.
그럼 한번 Custom Error를 만들어보겠습니다.
Error 프로토콜을 채용한 NumberError라는 enum을 선언했습니다.
Enum case에는 특정 숫자를 넘으면 에러라고 나타낼 largeNumber와 음수일 때 에러를 표시하는 negativeNumber를 선언했습니다.
어떠한 Type 즉 class, struct, enum 모두 다 Error를 나타내는 타입으로 만들 수 있습니다.
그런데 생각해보면 Error에는 대부분 정해진 종류가 있고 error가 발생할 때 담을 데이터도 없거나 복잡하지 않기 때문에 enum으로 만드는 게 대부분입니다.
만약 무엇인가 데이터를 담고 싶다면 associated value를 이용해주면 됩니다.
throw
자 그럼 우리는 이제 Custom Error를 생성했습니다.
그럼 이제 Error를 사용할 줄 알아야겠죠?
이때 나오는 키워드가 바로 throw와 throws입니다.
Error를 발생시켰다는 것은 예상치 못한 상황이 발생하거나 일반적인 실행 흐름을 더 이상 진행할 수 없다는 것을 나타냅니다.
그럼 여기서 Error를 '발생'시키는 것 이것을 영어로 throw라는 단어를 사용합니다.
흔히 '에러를 던진다'라고 표현을 하죠.'
그래서 저도 여기서부터 에러를 발생시킨다는 것을 에러를 던진다라고 표현하겠습니다.
이 단어로부터 나온 키워드가 바로 throw입니다.
throw 키워드를 사용해서 Error를 던질 수 있습니다.
throw의 사용법은 throw 뒤에 Error프로토콜을 채용한 타입의 인스턴스를 적어주면 됩니다.
여기서 Line 6의 의미는 1000이 넘는 숫자가 발생했다는 것을 알려주는 Error를 던진 것입니다.
throws
대충 보면 헷갈릴 수 있는 게 바로 throw와 throws입니다.
저도 처음에 볼 때 조금 헷갈렸는데요.
두 키워드의 쓰임새는 다릅니다.
throw는 에러를 던질 때 사용하는 키워드입니다.
그럼 throws는 뭐할 때 사용하는 키워드일까요?
갑자기 이 내용을 가져온 이유는 우리가 자주 throws를 접했던 메서드이기 때문입니다.
이 메서드는 JSONDecoder의 decode 메서드입니다.
여기서 보면 파라미터 뒤에 throws라는 키워드를 볼 수 있습니다.
설명에서도 보면 이 메서드는 DecodingError를 throws할 수 있다고 설명하고 있습니다.
이제 조금 감이 잡히시나요??
throws 키워드는 메서드, 생성자, 클로저가 내부에서 Error를 throw할 수 있을 때 사용하는 키워드입니다.
이전에 throw를 통해서 에러를 던졌습니다.
그런데 이것은 playground에서 작성한 특이한 상황입니다.
바로 global scope에서 Error를 throw 했다는 부분이 매우 한정적인 상황입니다.
대부분의 Error를 throw 하는 경우에는 global scope가 아니라 local scope에서 하게 됩니다.
그럼 일반적인 상황으로 돌아와서 함수 안에서 에러를 던져보도록 하겠습니다.
해당 함수는 number를 파라미터로 받아서 그 숫자가 1000보다 크다면 Error를 throw 하는 함수입니다.
그런데 이전과 같이 사용했음에도 불구하고 에러가 발생합니다.
그 이유는 바로 throws를 선언하지 않고 throw 키워드를 사용했다고 하는데요.
이렇게 throw를 통해서 Error를 던지고 싶다면 해당 함수가 에러를 throw 할 수 있다고 명시를 해주어야 합니다.
그래야 우리는 이 함수를 호출할 때 이 함수는 Error가 발생할 수 있는 함수이고 이에 따른 적절한 handling을 통해서 Error를 손봐줘야 한다고 알 수 있기 때문입니다.
파라미터 뒤에 이렇게 throws 키워드만 추가해주면 이전에 발생하던 문제는 말끔히 사라집니다.
이 경우에는 1000보다 작고 0보다 큰 경우에만 에러가 발생하지 않고 1000보다 크거나 0보다 작다면 각 상황에 맞는 Error를 던지는 함수를 정의했습니다.
함수, 메서드, 생성자, 클로저에서 throws를 선언할 때는 parameter뒤에 선언해주면 됩니다.
정리
정리하자면 throw 키워드는 Error를 던질 때 사용하는 키워드입니다.
그리고 throws 키워드는 해당 메서드, 생성자, 클로저가 Error를 던질 수 있다고 표시해주는 키워드입니다.
throw 함수 호출하기
자 그럼 이 함수를 한번 호출해보도록 하겠습니다.
우리가 일반적으로 사용하는 것처럼 함수를 호출했더니 에러가 발생합니다.
throws 키워드가 추가된 함수나 메서드를 호출할 때는 try 키워드를 사용해서 호출해야 합니다.
그럼 try가 무엇인지 do-catch가 무엇인지 다음 포스팅에서 다뤄보도록 하겠습니다.
참고자료
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
여러분의 새로운 도전을 응원합니다 | KxCoding
Mastering SwiftUI 더 적은 코드로, 더 멋진 UI 만들기
kxcoding.com
728x90'Programming > Swift' 카테고리의 다른 글
Swift - Error Handling (throws와 rethrows) (0) 2022.03.27 Swift - Error Handling(throws) (0) 2022.03.25 Swift - UserDefaults에 customType 저장하기 (0) 2022.03.01 Swift - reduce(_:_:)와 reduce(into:_:) (0) 2022.01.29 Swift - Generic Type Constraint (0) 2022.01.25