How often do you actually need to handle those errors differently? In my experience, it is vastly more likely that a function which can throw errors in Java looks like this:
Stuff foo() throws SameException {
return doOtherStuff(doStuff())
}
Whereas in Go the exact same function must be written like this: func foo() (Stuff, SameException) {
thing1, err := doStuff()
if err != nil {
return err
}
thing2, err := doOtherStuff(thing1)
if err != nil {
return err
}
}
Propagating is by far the most common "error handling" and Go constantly makes you break the flow of the code to do it.