Después de buscar algunas referencias para resolverlo, desafortunadamente, no pude encontrar una descripción útil y simple para comprender las diferencias entre throws
y rethrows
. Es un poco confuso tratar de entender cómo debemos usarlos.
Mencionaría que estoy familiarizado con el -predeterminado- throws
con 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 throws
o rethrows
?
rethrow
s solo se usan con cierres, aparte de que no son necesarios?rethrows
solo 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-type
función de lanzamiento. Es por eso que rethrows puede determinar cuál es y solo requieretry
cuando 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