seong_hye, the developer

Swift) 문법 정리 - 에러 처리(Error Handling) 본문

IOS

Swift) 문법 정리 - 에러 처리(Error Handling)

seong_hye 2022. 7. 12.

 

프로젝트를 진행하다보면 만날 수 밖에 없고 반드시 해결해야 할 에러(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

 

Error | Apple Developer Documentation

A type representing an error value that can be thrown.

developer.apple.com

https://www.inflearn.com/courses/lecture?courseId=45075&unitId=6497&tab=curriculum

 

https://www.inflearn.com/courses/lecture?courseId=45075&tab=curriculum&unitId=6497

 

www.inflearn.com

 

'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
Comments