Después de buscar algunas referencias para resolverlo, desafortunadamente, no pude encontrar una descripción útil y simple para comprender las diferencias entre throwsy rethrows. Es un poco confuso tratar de entender cómo debemos usarlos.
Mencionaría que estoy familiarizado con el -predeterminado- throwscon su forma más simple para propagar un error, de la siguiente manera:
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")
}
}
Hasta ahora todo bien, pero el problema surge cuando:
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
}
lo que sé hasta ahora es que, al llamar a una función throws, debe ser manejada por a try, a diferencia de rethrows. ¡¿Y qué?! ¿Cuál es la lógica que debemos seguir al decidir utilizar throwso rethrows?

rethrows solo se usan con cierres, aparte de que no son necesarios?rethrowssolo se usa con funciones que toman parámetros de función que podrían arrojar.Solo para agregar algo junto con la respuesta de Martin. Una función de no lanzar con la misma firma que una función de lanzar se considera una
sub-typefunción de lanzamiento. Es por eso que rethrows puede determinar cuál es y solo requieretrycuando el func param también lanza, pero aún acepta la misma firma de función que no lanza. Es una forma conveniente de tener que usar solo un bloque do try cuando se lanza el parámetro func, pero el otro código de la función no arroja un error.fuente