5 ms·
Edit: To clarify, the handle() system does indeed resemble an exception propagation system and is also the part I like least. Just "check" would be preferable,
by the_duke 8y ago
Edit: To clarify, the handle() system does indeed resemble an exception propagation system and is also the part I like least.
Just "check" would be preferable, with an implicit handler of "if err != nil { return err }"
Although I still would prefer something leaner like the "?" operator from Rust.
- quotemstr 8y ago> The draft design introduces two new syntactic forms. First, it introduces a checked expression check f(x, y, z) or check err, marking an explicit error check. Second, it introduces a handle statement defining an error handler. When an error check fails, it transfers control to the innermost handler, which transfers control to the next handler above it, and so on, until a handler executes a return statement. Sure. It's explicit error handling that just so happens to look exactly like a form of exception handling, c.f., the zero-overhead exceptions proposal in C++land. This is how you say, in language-design-ese, "I want to do what my critics have been saying for years is the right thing without admitting that they've been right all along".
- heavenlyhash 8y agoI really don't know where people get on this high horse and imagine that there's been some kind of fighting attitude here. I saw a talk by James Gosling (of Java fame) a few months ago in which he said one of the most important things he's glad he did throughout the development of the language is "Decide... not to decide". The purpose of this "deciding not to decide" should sound familiar by now: once you commit to something, it's hard to backtrack. And once it's hard to backtrack, you have lost your ability to look for more optimal solutions than the one you've fixated on. This is why generics in Java took so long. And to this day, the developers of those generics do not regret taking their time to do so. I think that's interesting to note, don't you? It's okay to make decisions after deliberation. Deliberation does not imply a fight. --- Tone police aside, did you... read... the proposals? I don't think it's correct to dismissively say that the proposed handle/check syntax is identical to other checked exception syntaxes; it doesn't compose in the same way as traditional try-catch blocks; and it doesn't have the power to create arbitrary longjumps across multiple stack frames as exceptions do. In short, it's very little like traditional exceptions at all.
- pjmlp 8y agoActually they do, hence the ongoing work to add value types and reified generics to Java, which is again a multi-year project with no defined end date.
- heavenlyhash 8y agoSure, but just like there's a difference between "deliberation" and "a fight", there's also a difference between "hmm, there's more to do" and "we regret the thinking we invested so far".
- rsc 8y agoIf you are interested in learning why check-handle differs from traditional exception handling, you can read https://go.googlesource.com/proposal/+/master/design/go2draft-error-handling-overview.md https://go.googlesource.com/proposal/+/master/design/go2draf.... If you just feel like snarking, then sorry for spoiling.
- erik_seaberg 8y agoIt looks like the only difference is that catch blocks precede try blocks and aren't indented to show how they nest. One could mechanically convert handle err { cleanup1() return 42, nil } handle err { cleanup2() } check dostuff() into try { try { dostuff(); } catch (Exception e) { cleanup2(); throw e; } } catch (Exception e) { cleanup1(); return 42; }
- ianlancetaylor 8y agoThat is not the only difference. Exceptions travel through calling functions if there is no catch clause. The check construct does not.
- spullara 8y agoThe default handler just propagates the error up to the caller.
- ianlancetaylor 8y agoAnd then the caller has to either check or ignore the error. The error never propagates to the caller's caller without an explicit action in the caller. That is unlike exceptions.
- quotemstr 8y agoBut it will propagate through a chain of unmarked check calls. If the requirement to mark potentially-throwing call sites is what disqualifies an error handling scheme as belonging to the class of exception systems, then we need a new term that includes both exceptions and this proposal and excludes everything else, because the proposed Go scheme very closely resembles exceptions.
- spullara 8y agoOk, we won't call them exception handlers. Instead, call them "if anything goes wrong in this function do this" handlers.
- SamWhited 8y agoThose are very different things, whatever you want to call them. check/handle doesn't involve unwinding the stack, and doesn't default to crashing your program if you forget to add a handle block.
- tonyedgecombe 8y agoand doesn't default to crashing your program if you forget to add a handle block Is that a good thing?
- grey-area 8y agoIs that a good thing? Yes, because instead your program won’t compile if you forget to handle an error ( except in the case of a function which only returns error, which you can ignore by mistake - I would like to see that fixed in go 2 as well).
- jerf 8y agoOne of the key characteristics of exception handling is the ability to set a handler in one stack frame, but receive exceptions from deeper in the stack, causing error-handling-at-a-distance. Anything that does not have that is not an exception system. Proof: Any exception system that lacked the ability to catch exceptions from lower frames would be called a defective exception system. This check keyword does not implement an exception handling system.
- spullara 8y agoThis is the default behavior of the new check system. If you don't handle it at the bottom of the stack it is propagated up the stack to the caller automatically. Not sure how easy this will be to debug since it doesn't capture a stack trace at the bottom and it won't be obvious where the error started.
- grey-area 8y agoBut isn’t it only to the immediate caller using the explicitly declared error, not all the way up the stack? That’s very different behaviour and along with using the error interface avoids the main objections to exceptions ( unexpected throws handled far from the error location, unexpected errr types). This is just a small change to make it easier to annotate and easier to return without comment.
- spullara 8y agoAssuming the caller uses check as well it will continue on. Seems the same as checked exceptions to me.
- grey-area 8y agoThat’s an invalid assumption, as most functions will not use check (looking at my code there are just a few places I’d use it). It’s an addition to current error handling, not a replacement.