Po wyszukaniu pewnych odniesień, aby to rozgryźć, -Niestety- nie mogłem znaleźć przydatnego - i prostego - opisu zrozumienia różnic między throwsi rethrows. To trochę zagmatwane, gdy próbujemy zrozumieć, jak powinniśmy ich używać.
Chciałbym wspomnieć, że jestem trochę zaznajomiony z -default- throwsz 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ę, throwsmusi 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 throwslub rethrows?