После поиска некоторых ссылок, чтобы разобраться в этом, - к сожалению - я не смог найти полезного - и простого - описания различий между 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
?