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
?