Nachdem ich nach einigen Referenzen gesucht hatte, um es herauszufinden, konnte ich leider keine nützliche und einfache Beschreibung zum Verständnis der Unterschiede zwischen throws
und finden rethrows
. Es ist etwas verwirrend, wenn man versucht zu verstehen, wie wir sie verwenden sollen.
Ich würde erwähnen, dass ich mit dem -default- throws
mit seiner einfachsten Form zur Verbreitung eines Fehlers wie folgt vertraut bin :
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")
}
}
So weit so gut, aber das Problem entsteht, wenn:
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
}
Was ich bisher weiß, ist beim Aufrufen einer Funktion, dass throws
sie im try
Gegensatz zu der von a verarbeitet werden muss rethrows
. Na und?! Welcher Logik sollten wir folgen, wenn wir uns für throws
oder entscheiden rethrows
?
rethrow
s nur mit Verschlüssen verwendet werden, außer dass sie nicht benötigt werden?rethrows
wird nur mit Funktionen verwendet, die Funktionsparameter annehmen, die möglicherweise ausgelöst werden.Nur um etwas zusammen mit Martins Antwort hinzuzufügen. Eine Nicht-Wurffunktion mit derselben Signatur wie eine Wurffunktion wird als eine
sub-type
der Wurffunktionen betrachtet. Aus diesem Grund können Rethrows bestimmen, um welche es sich handelt, und nur dann,try
wenn der func-Parameter ebenfalls ausgelöst wird, aber immer noch dieselbe Funktionssignatur akzeptiert, die nicht ausgelöst wird. Es ist eine bequeme Möglichkeit, nur einen do try-Block verwenden zu müssen, wenn der func-Parameter ausgelöst wird, aber der andere Code in der Funktion gibt keinen Fehler aus.quelle