spróbuj, spróbuj! & spróbuj? jaka jest różnica i kiedy używać każdego z nich?

W Swift 2.0 , Apple wprowadziło nowy sposób obsługi błędów (do-try-catch). A kilka dni temu w wersji Beta 6 wprowadzono jeszcze nowsze słowo kluczowe (try?). / Align = "center" bgcolor = "# e0ffe0 " / cesarz chin / / align = center / Jaka jest różnica między 3 słowami kluczowymi i kiedy używać każdego z nich?

Author: Ahmad F, 2015-09-04

1 answers

Aktualizacja dla Swift 5.1

Przyjmij następującą funkcję rzucania:

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)
  }
}

Spróbuj

Masz 2 opcje, gdy próbujesz wywołać funkcję, która może rzucać.

Możesz wziąć odpowiedzialność za obsługę błędów otaczając swoje połączenie w bloku 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)
}

Lub po prostu spróbuj wywołać funkcję i przekaż błąd wzdłuż do następnego wywołującego w łańcuchu połączeń:

func doSomeOtherThing() throws -> Void {    
    // Not within a do-catch block.
    // Any errors will be re-thrown to callers.
    let result = try doSomething()
}
Spróbuj!

Co się dzieje, gdy próbujesz uzyskać dostęp do niejawnie rozpakowanej opcji z zerowym w środku? Tak, to prawda, aplikacja się zawiesi! To samo tyczy się try! zasadniczo ignoruje łańcuch błędów i deklaruje sytuację "zrób albo giń". Jeśli wywołana funkcja nie wyrzuciła żadnych błędów, wszystko idzie dobrze. Ale jeśli się nie powiodło i wystąpił błąd, Twoja aplikacja po prostu się zawiesi .

let result = try! doSomething() // if an error was thrown, CRASH!

Spróbować?

Nowe słowo kluczowe, które zostało wprowadzone w Xcode 7 beta 6. To zwraca opcjonalny, który rozpakowuje wartości pomyślne i wychwytuje błąd zwracając zero.

if let result = try? doSomething() {
    // doSomething succeeded, and result is unwrapped.
} else {
    // Ouch, doSomething() threw an error.
}

Lub możemy użyć strażnika:

guard let result = try? doSomething() else {
    // Ouch, doSomething() threw an error.
}
// doSomething succeeded, and result is unwrapped.

Ostatnia uwaga tutaj, używając try? zauważ, że odrzucasz błąd, który miał miejsce, ponieważ jest tłumaczony na zero. Spróbuj? kiedy skupiasz się bardziej na sukcesach i porażkach, nie na tym, dlaczego rzeczy zawiodły.

Używając Operatora Koalescencyjnego ??

Możesz użyć operatora koalescencyjnego ?? spróbować? aby podać domyślną wartość w przypadku awarii:
let result = (try? doSomething()) ?? "Default Value"
print(result) // Default Value
 334
Author: Abdurrahman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-29 10:22:25