Після пошуку деяких посилань, щоб зрозуміти це, - на жаль - я не зміг знайти корисний - і простий - опис розуміння відмінностей між throws
та rethrows
. Це заплутано, коли намагаємося зрозуміти, як ми повинні ними користуватися.
Я б зазначив, що я знайомий з -default- throws
з його найпростішою формою поширення помилки, наступним чином:
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")
}
}
Поки що добре, але проблема виникає, коли:
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
}
На сьогоднішній день я знаю, що при виклику функції, throws
вона повинна оброблятись на try
відміну від rethrows
. І що?! Що є логікою, якої ми повинні керуватися, коли приймаємо рішення про використання throws
чи rethrows
?