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


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.