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