답변:
Swift 5.1 용으로 업데이트
다음과 같은 던지기 기능을 가정하십시오.
enum ThrowableError: Error {
case badError(howBad: Int)
}
func doSomething(everythingIsFine: Bool = false) throws -> String {
if everythingIsFine {
return "Everything is ok"
} else {
throw ThrowableError.badError(howBad: 4)
}
}
던질 수있는 함수를 호출 할 때 두 가지 옵션이 있습니다.
do-catch 블록 내에서 통화를 둘러싸면 오류 처리 를 담당 할 수 있습니다 .
do {
let result = try doSomething()
}
catch ThrowableError.badError(let howBad) {
// Here you know about the error
// Feel free to handle or to re-throw
// 1. Handle
print("Bad Error (How Bad Level: \(howBad)")
// 2. Re-throw
throw ThrowableError.badError(howBad: howBad)
}
또는 함수 호출을 시도 하고 호출 체인의 다음 호출자에게 오류를 전달하십시오 .
func doSomeOtherThing() throws -> Void {
// Not within a do-catch block.
// Any errors will be re-thrown to callers.
let result = try doSomething()
}
내부에 래핑되지 않은 옵션에 nil이있는 옵션에 액세스하려고하면 어떻게됩니까? 예, 사실 앱이 충돌합니다! 시도와 동일합니다! 기본적으로 오류 체인을 무시하고 "do or die"상황을 선언합니다. 호출 된 함수가 오류를 발생시키지 않으면 모든 것이 잘됩니다. 그러나 실패하고 오류가 발생하면 응용 프로그램이 단순히 중단 됩니다.
let result = try! doSomething() // if an error was thrown, CRASH!
Xcode 7 베타 6에 도입 된 새로운 키워드로 성공적인 값을 풀고 nil을 반환하여 오류를 포착 하는 옵션 을 반환합니다 .
if let result = try? doSomething() {
// doSomething succeeded, and result is unwrapped.
} else {
// Ouch, doSomething() threw an error.
}
또는 우리는 guard를 사용할 수 있습니다 :
guard let result = try? doSomething() else {
// Ouch, doSomething() threw an error.
}
// doSomething succeeded, and result is unwrapped.
여기에 하나의 마지막 메모 try?
는 nil로 변환되어 발생한 오류를 무시한다는 것입니다. 사용해보십시오? 실패한 이유가 아니라 성공과 실패에 더 집중할 때
통합 연산자를 사용할 수 있습니까 ?? 시도와 함께? 실패시 기본값을 제공합니다.
let result = (try? doSomething()) ?? "Default Value"
print(result) // Default Value
try?
함께 사용 ??
하면 한 줄로 기본값을 정의 할 수 있습니다.let something:String = (try? whateverIfItThrows()) ?? "Your default value here"
let result = try doSomething() // Not within a do-catch block
)은로 선언 된 메소드 내에서 호출되어야합니다throws
. 따라서doSomething()
실패하면 외부 방법도 마찬가지입니까?