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
?