Po wyszukaniu pewnych odniesień, aby to rozgryźć, niestety, nie mogłem znaleźć użytecznego i prostego opisu zrozumienia różnic między throws
i rethrows
. To trochę zagmatwane, gdy próbujemy zrozumieć, jak powinniśmy z nich korzystać.Jakie są różnice między rzutami a ponownymi rzutami w Swift?
chciałbym wspomnieć, że jestem trochę zaznajomiony z -default- throws
z najprostszej postaci propagacji błędu, co następuje:
enum CustomError: Error {
case potato
case tomato
}
func throwCustomError(_ string: String) throws {
if string.lowercased().trimmingCharacters(in: .whitespaces) == "potato" {
throw CustomError.potato
}
if string.lowercased().trimmingCharacters(in: .whitespaces) == "tomato" {
throw CustomError.tomato
}
}
do {
try throwCustomError("potato")
} catch let error as CustomError {
switch error {
case .potato:
print("potatos catched") // potatos catched
case .tomato:
print("tomato catched")
}
}
Jak na razie dobrze, ale problem powstaje, kiedy:
func throwCustomError(function:(String) throws ->()) throws {
try function("throws string")
}
func rethrowCustomError(function:(String) throws ->()) rethrows {
try function("rethrows string")
}
rethrowCustomError { string in
print(string) // rethrows string
}
try throwCustomError { string in
print(string) // throws string
}
co wiem do tej pory podczas wywoływania funkcji, która throws
musi być obsługiwane przez try
, w przeciwieństwie do rethrows
. Więc co?! Jaką logikę powinniśmy przestrzegać, decydując się na użycie throws
lub rethrows
?
Świetna odpowiedź. Dzięki. – Darko
Ostatnie zdanie jest złote! – Klaas
, więc domyślam się podsumować, 'rethrow' kiedy * może * chcesz rzucić. "rzucaj", gdy chcesz ** ograniczyć do zawsze ** rzucania – Honey