Neošetřují.
V Golangu jde typicky o dvě návratové hodnoty, kde jedna je typu error (nebo ok:bool). Ten je ovšem velice abstraktní a neumí nic, kromě testu při přetypování. Hlavičky funkcí také nijak nespecifikují jaké errory se na výstupu mohou objevit.
def funkce() (Typ, error) { if val, err := funkce(); err != nil { return nil, err } }
V Rustu jde o jednu hodnotu v enumu Result a error typ v Resultu má konkrétní známý typ:
Takto použito by to vypadalo skoro stejně:
if let Err(err) = funkce() { return Err(err) }
Jenže v Rustu lze díky tomu Result typu používat mnohem komplikovanější logiku. Result má funkce jako map a také se dá použít operátor otazník (tj. při erroru zavolej return error).
fn funkce() -> Result<(), ErrTyp> { funkce2().map_err(|e| e.do_err_typu())? funkce3()? Ok(()) // Návratová hodnota v případě úspěchu }
Výhoda jedné návratové hodnoty je právě v možnosti řetězení a zanoření.
V principu je rozdíl mezi těmi přístupy malý, ale v praxi ta syntaxe je v Rustu kratší a jednoznačně definované typy chyb jsou přehlednější.
Blízký ekvivalent toho otazníku z Rustu je tento návrh pro Golang, který nicméně zatím nebyl implementován: https://go.googlesource.com/proposal/+/master/design/go2draft-error-handling.md