Especially for tracing/logging of errors returned from functions; or for e.g. rolling back DB transactions in the event of an error.
Here's some ~100 examples from my work's (Sourcegraph's) codebase[0]
[0] https://sourcegraph.com/search?q=context:global+repo:%5Egith...
(Also I'm not sure if the compiler would catch this, but there seems to be a bug in that Go code that's hard to see at a glance. You're never assigning a value to result)
func iferr(err *error, f func()) {
if err != nil { f() }
}
// use
func whatever(...) (err error) {
thing := ...
defer iferr(&err, thing.Method)
}
But that only works with an exact match, so that example can't match e.g. `Close() error`, so you still have to either make a ton of near-clones for different signatures, or use a ton of trivial closures (like with the manual version), to make the type system happy.Which can be worth it in a large enough project - `func()` and `func() error` will take care of like 90% of the signatures you'd defer anyway. I'd probably do that personally, unless I only needed it once or twice.
There has been a somewhat similar check/handle proposal (close to "try"), but it has consistently fallen into "they're great for trivial cases, but they make it harder to have good error messages / wrap errors with additional context", which is absolutely necessary in Go since errors are so loosely typed and contain only explicitly-added information (no stacks by default, for example). So I'm glad they haven't happened yet.
On Error Goto line
try
...
except
end
wrapped around the error/exception generating code
The Zig equivalent seems like it would be roughly (I don't know Zig)
which is quite a bit more palatable and future-mistake-resistant. A sizable chunk of that is due to `try` of course, but still.