시도해보십시오! 시도해? 차이점은 무엇이며 언제 사용해야합니까?


172

에서 스위프트 2.0 , 애플은 오류를 (할 - 시도 - 캐치를) 처리 할 수있는 새로운 방법을 소개했다. 며칠 전 베타 6에서는 더 새로운 키워드가 소개되었습니다 ( try?). 또한 사용할 수 있음을 알고있었습니다 try!. 3 개의 키워드와 각각의 키워드를 언제 사용해야합니까?

답변:


316

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

두 번째 코드 샘플 ( let result = try doSomething() // Not within a do-catch block)은로 선언 된 메소드 내에서 호출되어야합니다 throws. 따라서 doSomething()실패하면 외부 방법도 마찬가지입니까?
Nicolas Miari

오래된 스레드와 오늘 (Swift 4, Xcode 9.1)이 시도한다는 것을 알았습니다. 결과를 자동으로 풀지 않습니다. 수동으로 포장을 풀려면 일반적인 옵션으로 남겨 둡니다. Swift 2/3 이후에 이것이 변경되었는지는 확실하지 않지만 문서는 developer.apple.com/library/content/documentation/Swift/…입니다 ( 오류를 선택적 값으로 변환 참조 ). 시도 btw에 대한 훌륭한 설명.
the_dude_abides

1
신속한 4에서 시도? 던지는 함수에 대한 호출이 내 프로젝트의 '시도'식 내에서 발생하지 않습니다.
aznelite89

7
try?함께 사용 ??하면 한 줄로 기본값을 정의 할 수 있습니다.let something:String = (try? whateverIfItThrows()) ?? "Your default value here"
itMaxence
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.