기본적으로 error protocol을 구현해 error의 case를 정의 할 수 있다.
//간단하게 아래와 같이 정의해볼 수 있다.
//해당 Error enum을 사용해 에러를 케이스별로 처리할 수 있게 된다.
enum HttpError: Error {
case serverError
case notFounded
case forbidden
}
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 {
try httpErrorCheck(code: 0) {
//Http 통신 성공
}
} catch HttpError.serverError {
print("서버에러")
} catch HttpError.notFounded {
print("404")
} catch HttpError.forbidden {
print("권한없음")
} catch {
print("알 수 없는 에러")
}
try? 구문을 사용하면 에러가 발생 시 optional 값으로 반환을 할 수 있습니다.
do - catch 보다 간결하게 구현이 가능해 간단한 에러를 처리하는 경우에 적합합니다.
func someThrowingFunction() throws -> Int {
// ...
}
let x = try? someThrowingFunction()
let y: Int?
do {
y = try someThrowingFunction()
} catch {
y = nil
}
//x와 y의 반환 값은 같습니다.
에러가 발생하지 않을 것이라고 확신할 때 사용합니다.
이미지 리소스 좌표, url 등등에 적합합니다.
! 가 붙기 때문에 에러가 발생하게 되면 runtime error가 발생할 수 있어 적절히 사용해야 합니다. (Swift에서 !는 무섭습니다.)
let photo = try! loadImage(atPath: "./Resources/John Appleseed.jpg")
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
#학습에 대한 내용으로 틀린 내용이 있을 수 있습니다.
#댓글로 남겨주시면 더 좋은 게시글로 수정하도록 하겠습니다.