Basic - Error Handling

Eli·2021년 2월 6일
1

Swift

목록 보기
6/17
post-thumbnail

Representing Error

기본적으로 error protocol을 구현해 error의 case를 정의 할 수 있다.

//간단하게 아래와 같이 정의해볼 수 있다.
//해당 Error enum을 사용해 에러를 케이스별로 처리할 수 있게 된다.
enum HttpError: Error {
		case serverError
		case notFounded
		case forbidden
}

Throws

throwing function을 구현해 에러를 발생시킬 수 있는 함수

//아래의 함수는 에러를 발생할 수 있는 함수로 do - catch, try 구문을 사용해 호출해야만 한다.
func canThrowErrors() throws -> String

func cannotThrowErrors() -> String

//아래의 함수는 http error code를 판단해 해당하는 에러를 throw하거나 success 콜백을 실행시킴
func httpErrorCheck(response code: Int, success: () -> Void) throws {
		switch code {
		case 500:
			throw HttpError.severError
		case 404:
			throw HttpError.notFounded
		case 403:
			throw HttpError.forbidden
		}

		success()
}

Do - Catch

do {
	try httpErrorCheck(code: 0) {
		//Http 통신 성공
	}
} catch HttpError.serverError {
	print("서버에러")
} catch HttpError.notFounded {
	print("404")
} catch HttpError.forbidden {
	print("권한없음")
} catch {
	print("알 수 없는 에러")
}

Try?

try? 구문을 사용하면 에러가 발생 시 optional 값으로 반환을 할 수 있습니다.
do - catch 보다 간결하게 구현이 가능해 간단한 에러를 처리하는 경우에 적합합니다.

func someThrowingFunction() throws -> Int {
    // ...
}

let x = try? someThrowingFunction()

let y: Int?
do {
    y = try someThrowingFunction()
} catch {
    y = nil
}

//x와 y의 반환 값은 같습니다.

Try!

에러가 발생하지 않을 것이라고 확신할 때 사용합니다.
이미지 리소스 좌표, url 등등에 적합합니다.
! 가 붙기 때문에 에러가 발생하게 되면 runtime error가 발생할 수 있어 적절히 사용해야 합니다. (Swift에서 !는 무섭습니다.)

let photo = try! loadImage(atPath: "./Resources/John Appleseed.jpg")

Defer

defer 구문을 사용해 사용이 완료되어 강제적으로 해지, 닫기 처리를 해야할 때 적절히 사용할 수 있다.

defer의 경우 1개 이상일 경우 아래부터 위로 처리가 되니 이 부분이 특이사항이다.
실제 사용 케이스를 경험해보지 못해서, 예시코드로만...

func processFile(filename: String) throws {
    if exists(filename) {
        let file = open(filename)
        defer {
            close(file) // block이 끝나기 직전에 실행, 주로 자원 해제나 정지에 사용
						print("두번째 defer")
        }
			
				defer {
					print("첫번째 defer")
				}

        while let line = try file.readline() {
           
        }
        print("작업 끝")
    }
}

//아래와 같은 순서로 실행이 된다.
//작업 끝
//첫번째 defer
//두번째 defer

#학습에 대한 내용으로 틀린 내용이 있을 수 있습니다.
#댓글로 남겨주시면 더 좋은 게시글로 수정하도록 하겠습니다.

profile
애플을 좋아한다. 그래서 iOS 개발을 한다. @Kurly

0개의 댓글