Po wyszukaniu pewnych odniesień, aby to rozgryźć, -Niestety- nie mogłem znaleźć przydatnego - i prostego - opisu zrozumienia różnic między throws
i rethrows
. To trochę zagmatwane, gdy próbujemy zrozumieć, jak powinniśmy ich używać.
Chciałbym wspomnieć, że jestem trochę zaznajomiony z -default- throws
z jego najprostszą formą propagowania błędu, jak 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 pojawia się, gdy:
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
}
do tej pory wiem, kiedy wywołując funkcję, throws
musi być obsługiwana przez a try
, w przeciwieństwie do rethrows
. Więc co?! Jaka jest logika, którą powinniśmy się kierować, decydując się na użycie throws
lub rethrows
?
rethrow
s są używane tylko z zamknięciami, poza tym, że nie są potrzebne?rethrows
jest używane tylko z funkcjami, które pobierają parametry funkcji, które mogą być generowane.Dodam tylko coś wraz z odpowiedzią Martina. Funkcja nie rzucająca z taką samą sygnaturą jak funkcja rzucająca jest uważana za
sub-type
funkcję rzucającą. Dlatego powtórki mogą określić, który to jest i wymagają tylkotry
wtedy, gdy parametr func również jest zgłaszany , ale nadal akceptuje tę samą sygnaturę funkcji, która nie jest zgłaszana . Jest to wygodny sposób, aby używać bloku do try tylko wtedy, gdy rzuca parametr func, ale drugi kod funkcji nie zgłasza błędu.źródło