> errors bubble upward through the call tree until they're handled. There's nothing simpler
Between
output_a := f1(input_a) // f1 throws exceptions on error output_b := f2(output_a) // f2 throws exceptions on error
output_a, err := f1(input_a) // inspect and deal with err output_b, err := f2(output_a) // inspect and deal with err
Exceptions make sense in a lot of contexts! Just not services, servers, or long-lived processes.