일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 글또
- copy-on-write
- On branch is up to date with ' '
- Git
- K디지털기초역량훈련
- 내_삶
- 주간 달력
- ios 개발 강의
- 연관값
- 코드스니펫
- IOS
- uikit
- class
- MyLife
- 글또9기
- unrecognized selector sent to class
- weekly calendar
- 다짐글
- Switch
- struct
- avaliable
- 회고
- SWIFT
- 제어전송문
- 파스칼표기법
- AnyObject
- 바이트디그리
- error해결
- 생명주기
- actionSheet
- Today
- Total
seong_hye, the developer
Swift) 문법 정리 - 에러 처리(Error Handling) 본문
프로젝트를 진행하다보면 만날 수 밖에 없고 반드시 해결해야 할 에러(Error)를 만나게 되는데요
오늘은 에러를 해결하기 위한 방법인 에러와 에러 처리 방식에 대해 알아보도록 하겠습니다.
오류(Error)란?
스위프트에서 Error란 오류를 보여주는 하나의 프로토콜로 오류가 발생하게 되면 throw로 해당 오류를 알려주게 됩니다.
오류 표현 방법으로는 Error 프로토콜을 사용하여 열거형을 통해 오류를 표현하게 됩니다.
enum 오류이름: Error {
case 종류1
case 종류2
case 종류3
}
예시로 문자열을 숫자로 바꾸는 경우 발생할 수 있는 오류를 작성해본다면 아래와 같이 작성될 수 있습니다.
enum IntParsingError: Error {
case overflow
case invalidInput(Character)
}
해당 경우를 string에서 Int로 변환되었을 때 오류를 확인할 수 있도록
Int extension을 활용해 오류가 발생하는 경우의 유형을 추가시켜줍니다.
extension Int {
init(validating input: String) throws {
...
let c = _nextCharacter(from: input)
if !_isValid(c) {
throw IntParsingError.invalidInput(c)
}
}
}
Error 타입의 다운캐스팅
Error타입을 채택하면, 열거형이 더 구체화된 에러형태로 구현된 것이라고 보시면 됩니다.
(결국 클래스에서 다운 캐스팅 형태와 동일한데, 열거형으로 되어 있는 것)
~> 문법적인 약속으로 만들어져 있는 내용
즉, 다운캐스팅으로 사용하게 되는 원리는
(1) 함수가 구체화된 에러를 던지던지고
(2) do-catch시스템에서는 상위의 Error 타입으로만 인지가 되기에 업캐스팅이 된 형태가 되며
(3) catch블럭 내부에서는 다시 구체화된 형태로 다운캐스팅해서 사용한다고 볼 수 있습니다.
if let 구체화된 에러 = 일반화된 형태 에러 as? HeightError
Error 타입이 필요한 경우
- 네트워크 연결: 서버 통신 확인
- 파일 읽을때: 파일 없거나 경로확인
- 사용자 입력: 이상한 값 처리, 유효성 검사
등등의 경우에서 코드 확인을 위해 사용됩니다.
에러처리란 ?
프로그램 내에서 발생한 상황에 대해 대응하고 이를 복구하는 과정을 말하는데요
오류 처리 방법
오류 발생의 여지가 있는 throws 함수(메서드)는 try를 사용하여 호출합니다.
do - catch
오류 발생의 여지가 있는 throws 함수(메서드)는 do-catch 구문을 활용하여 오류 발생에 대비합니다.
do 안에서 try로 작성한 메서드를 통해 Error를 trhow하는 코드를 부릅니다.
에러가 발생하지 않았다면 그대로 진행하게 됩니다.
do에서 작성한 코드에 Error가 발생했을 때 catch에서는 해당 에러와 맞는 예외처리를 하게 됩니다.
do {
let price = try Int(validating: "$100")
} catch IntParsingError.invalidInput(let invalid) {
print("Invalid character: '\(invalid)'")
} catch IntParsingError.overflow {
print("Overflow error")
} catch {
print("Other error")
}
// 결과 - "Invalid character: '$'"
catch 구문에서는 ,(콤마)를 활용하여 동시에 에러를 할 수도 있고
where 절을 활용하여 조건을 추가할 수도 있습니다.
예외 상황을 다루는 do - catch 구문에서는
do문에서 try로 작성한 메서드에 에러가 발생하면 앱이 종료되지 않고 catch 문에서 처리되게 됩니다.
이 때 do - catch 문을 모두 작성하지 않아도 간편하게 에러 처리 가능한 방식에 대해 알아보려고 합니다.
try?와 try!
try?
별도의 오류 처리 결과를 통보받지 않고 오류가 발생했으면 결과값을 nil로 돌려받을 수 있습니다.
정상동작 후에는 옵셔널 타입으로 정상 반환값을 돌려 받습니다.
if let intParsing = try? Int(validating: "$100") {
return intParsing
}
// nil
try!
오류가 발생하지 않을 것이라는 강력한 확신이 있을 경우에만 사용해야 합니다.
정상동작시에는 결과값을 돌려받지만 오류가 발생하게 되면 런타입 오류가 발생하여 어플 동작을 중지합니다.
let intParsing = try! Int(validating: "$100")
// error 발생과 동시에 런타임 오류 발생
참고자료)
https://developer.apple.com/documentation/swift/error
https://www.inflearn.com/courses/lecture?courseId=45075&unitId=6497&tab=curriculum
'IOS' 카테고리의 다른 글
Swift)문법 정리 - 고차함수 (0) | 2022.07.12 |
---|---|
Swift) 문법 정리 - 클로저 (Closure) (0) | 2022.07.12 |
Swift) 문법 정리 - 열거형(Enum) (0) | 2022.07.12 |
Swift) 문법 정리 - 프로토콜 (0) | 2022.07.12 |
Swift) 문법 정리 - 튜플 (0) | 2022.07.12 |