func doSomething(num: Int) -> Bool {
if num >= 7 {
return true
}
else {
return false
}
}
enum SomeError: Error {
case aError
case bError
case cError
}
func doSomething(num: Int) throws -> Bool {
if num >= 7 {
return true
}
else {
if num < 0 {
throw SomeError.aError
}
return false
}
}
에러 처리 3단계
1. 에러 정의
enum HeightError: Error {
case maxHeight
case minHeight
}
2. 에러가 발생할 수 있는 함수에 대한 정의
func checkingHeight(height: Int) throws -> Bool {
if height > 190 {
throw HeightError.maxHeight
}
else if height < 130 {
throw HeightError.minHeight
}
else {
if height >= 160 {
return true
}
else {
return false
}
}
}
3. 에러가 발생할 수 있는 함수의 처리 (함수의 실행)
do {
var result = try checkingHeight(height: 160)
print("놀이기구 타는 것 가능 : \(result)")
} catch {
print("놀이기구 타는 것 불가능")
}
에러 처리 방법 - try/try?/try!
정식 처리 방법 - try
do {
let isChecked = try checkingHeight(height: 200)
if isChecked {
print("청룡열차 가능")
} else {
print("후룸라이드 가능")
}
} catch {
print("놀이기구 타는 것 불가능")
}
옵셔널 타입으로 리턴 - try?
- 정상적인 경우 -> (정상) return 타입으로 return
- 에러 발생 -> nil return
let isChecked = try? checkingHeight(height: 200)
Forced try - try!
- 정상적인 경우 -> (정상) return 타입으로 return
- 에러 발생 -> runtime error
let isChecked2: Bool = try! checkingHeight(height: 150)
Catch 블럭 처리
do {
let isChecked = try checkingHeight(height: 100)
print("놀이기구 타는 것 가능: \(isChecked)")
}
catch HeightError.maxHeight {
print("키가 커서 놀이기구 타는 것 불가능")
} catch HeightError.minHeight {
print("키가 작아서 놀이기구 타는 것 불가능")
}
```swift
do {
let isChecked = try checkingHeight(height: 100)
print("놀이기구 타는 것 가능: \(isChecked)")
}
catch {
print(error.localizedDescription)
if let error = error as? HeightError {
switch error {
case .maxHeight:
print("키가 커서 놀이기구 타는 것 불가능")
case .minHeight:
print("키가 작아서 놀이기구 타는 것 불가능")
}
}
}
do {
let isChecked = try checkingHeight(height: 100)
print("놀이기구 타는 것 가능: \(isChecked)")
} catch HeightError.maxHeight, HeightError.minHeight {
print("놀이기구 타는 것 불가능")
}
에러 던지는 함수를 처리하는 함수
enum SomeError: Error {
case aError
}
func throwingFunc() throws {
throw SomeError.aError
}
do {
try throwingFunc()
} catch {
print(error)
}
일반적인 함수로 처리
- 함수 내부에서 do-catch문으로 에러 처리
func handleError() {
do {
try throwingFunc()
} catch {
print(error)
}
}
handleError()
1. throwing 함수로 에러를 다시 던지기
- 함수 내에서 에러를 직접 처리하지 못하는 경우, 에러를 다시 던진다
func handleError1() throws {
try throwingFunc()
}
do {
try handleError1()
} catch {
print(error)
}
2. rethrowing 함수로 에러를 다시 던지기
- 에러를 던지는 throwing함수를 파라미터로 받는 경우, 내부에서 다시 에러 던지기 가능
func someFunction1(callback: () throws -> Void) rethrows {
try callback()
}
func someFunction2(callback: () throws -> Void) rethrows {
enum ChangedError: Error {
case cError
}
do {
try callback()
} catch {
throw ChangedError.cError
}
}
do {
try someFunction1(callback: throwingFunc)
} catch {
print(error)
}
do {
try someFunction2(callback: throwingFunc)
} catch {
print(error)
}
Defer 문
- 할일을 미룬다
- 코드의 실행을 스코프가 종료되는 시점으로 연기시킨다
func deferStatement1() {
defer {
print("나중에 실행하기")
}
print("먼저 실행하기")
}
deferStatement1()
func deferStatement2() {
if true {
print("먼저 실행하기")
return
}
defer {
print("나중에 실행하기")
}
}
deferStatement2()
func deferStatement3() {
defer {
print(1)
}
defer {
print(2)
}
defer {
print(3)
}
}
deferStatement3()
for i in 1...3 {
defer { print ("Defer된 숫자?: \(i)") }
print ("for문의 숫자: \(i)")
}