4 ms·
Go doesn't lack exceptions. It just uses some different names (throw -> panic, catch -> recover) and uses a different way to write the code that catches them.
by ericbb 15y ago
Go doesn't lack exceptions. It just uses some different names (throw -> panic, catch -> recover) and uses a different way to write the code that catches them.
http://golang.org/doc/go_spec.html#Handling_panics http://golang.org/doc/go_spec.html#Handling_panics
Edit: Also, here's an interesting pattern to illustrate that Go's panics are a little different.
func parse(s string, config *Config) (x Thing, err error) {
defer config.RecoveryPlan(&x, &err)
x, err = doParse(s)
}
It's contrived, but you can see that the "RecoveryPlan" can choose to ignore panics or recover from them and it can also affect the return value of the "parse" call by assigning to its parameters and recovering from the panic.
- barrkel 15y agoOh, I know about this already. Trouble is, panics aren't supposed to cross module boundaries. "The convention in the Go libraries is that even when a package uses panic internally, its external API still presents explicit error return values" http://blog.golang.org/2010/08/defer-panic-and-recover.html http://blog.golang.org/2010/08/defer-panic-and-recover.html But crossing interfaces between modules is, IMO, core to exceptions. They're ideally suited to communicating the underlying cause of failure from the depths of the system to the top-most loop (usually a request/response dispatcher or UI event loop), where the error message can be logged or shown to the user, as required, indicating the nature of the failure. I expounded further on this point a few years ago, related to Java's misadventure with checked exceptions, but also relevant to module crossing: http://cafe.elharo.com/programming/bruce-eckel-is-wrong/#comment-476790 http://cafe.elharo.com/programming/bruce-eckel-is-wrong/#com...
- ericbb 15y agoI won't get into the interface-crossing issue except to say that exceptions to the convention do exist. For example: http://golang.org/pkg/regexp/#MustCompile http://golang.org/pkg/regexp/#MustCompile