News for hackers. Stuff that matters.
Re:You Can Throw() Anything in JavaScript – and Other Async/... by onion2k on Friday April 08, 2022 @06:50AM (#30955429)
Nonsense. You can treat Throw like a fancy "goto the nearest catch" if you want to. It works fine.
Re:You Can Throw() Anything in JavaScript – and Other Async/... by dspillett on Friday April 08, 2022 @07:20AM (#30955599)
That sounds fine as a quick hack in your own code that you never intend others to use, but if something like that escapes your library into calling code (isn't always properly trapped by your exception handling due to a bug) you are asking others to deal with a significant change to a commonly accepted standard behaviour.
Re:You Can Throw() Anything in JavaScript – and Other Async/... by the_other on Friday April 08, 2022 @07:42AM (#30955734)
Isn't "ensuring you always throw Errors" the same level of code cleanliness as "keep a top level catch in your code" or "document the errors and exceptions of your API"? If you make your team do one, you can make them do another.
Re:You Can Throw() Anything in JavaScript – and Other Async/... by chrisco255 on Friday April 08, 2022 @09:00AM (#30956294)
> you are asking others to deal with a significant change to a commonly accepted standard behaviour.

For a JavaScript developer, that's just Tuesday.

Re:You Can Throw() Anything in JavaScript – and Other Async/... by dspillett on Friday April 08, 2022 @09:58AM (#30956822)
And that Tuesday lasts all day until Friday. Sounds about right.
Re:You Can Throw() Anything in JavaScript – and Other Async/... by smt88 on Friday April 08, 2022 @06:56AM (#30955463)
If you're using throw for control flow, something is deeply wrong with your code.
Re:You Can Throw() Anything in JavaScript – and Other Async/... by regularfry on Friday April 08, 2022 @07:41AM (#30955730)
Now I'm wondering about throwing functions as continuations. This sounds incredibly messy. I love it.
Re:You Can Throw() Anything in JavaScript – and Other Async/... by shadowgovt on Friday April 08, 2022 @08:57AM (#30956274)
I... May have done something like this once in a scripting language interpreter to implement return and break.

Not in JavaScript. And using continuations passed down from above would have been the much more correct way to do things.

Re:You Can Throw() Anything in JavaScript – and Other Async/... by emteycz on Friday April 08, 2022 @08:27AM (#30956038)
Why not generators then?
Re:You Can Throw() Anything in JavaScript – and Other Async/... by regularfry on Friday April 08, 2022 @08:55AM (#30956263)
Because that wouldn't be perversely abusing a language feature for completely the wrong purpose.
Re:You Can Throw() Anything in JavaScript – and Other Async/... by the_other on Friday April 08, 2022 @07:39AM (#30955722)
`throw` is a control flow instruction. Simply using it at all controls flow within your code. Are you suggesting never to use it?
Re:You Can Throw() Anything in JavaScript – and Other Async/... by smt88 on Friday April 08, 2022 @11:54AM (#30958800)
I am suggesting to use it to throw exceptions. This narrow purpose is subtly hinted at by its name.
Re:You Can Throw() Anything in JavaScript – and Other Async/... by the_other on Saturday April 09, 2022 @11:15AM (#30968747)
I don’t see how it’s hinted in the name. “Throwing an exception” is a phrase from within computing that exists because the feature exists in some languages, not because it came into programming from English.

There’s also nothing about “exception” that means “error”. If anything, modelling exceptions as errors is the anti-pattern. If you modelled all exceptions as descriptors, you could save Errors for when something actually goes wrong.

Honestly though, I’m employing Socratic argument. I am only defending this position to learn about the opposite.

Re:You Can Throw() Anything in JavaScript – and Other Async/... by golergka on Friday April 08, 2022 @08:27AM (#30956031)
I think that the parent comment means "for control flow unrelated to error conditions".
Re:You Can Throw() Anything in JavaScript – and Other Async/... by onion2k on Friday April 08, 2022 @09:00AM (#30956292)
There isn't though. Exceptions are flow control. There's nothing particularly special about them internally in a JS engine. https://ripsawridge.github.io/articles/exceptions/
Re:You Can Throw() Anything in JavaScript – and Other Async/... by smt88 on Friday April 08, 2022 @10:15AM (#30957018)
I know. But what happens when someone inherits code that has a lot of this in it? They read a line, get to a throw, and then... how do they find all the catches that might apply?

Using that pattern is like a guarantee that your code will be spaghetti and meatballs.

This concept is so fundamental that it's even the topic of possibly the most famous CS article ever written[1], and I'd even argue that throw/catch is the worst-possible version of goto.

1. https://en.m.wikipedia.org/wiki/Considered_harmful

Re:You Can Throw() Anything in JavaScript – and Other Async/... by onion2k on Friday April 08, 2022 @11:44AM (#30958668)
When Dijkstra wrote his article [1], in 1968, I have no doubt he was correct. His point was essentially that code should reflect the flow of the application as closely as possible because it's immensely hard to keep everything in your head if it doesn't in the context of programming in 1968.

The thing is though, tools have moved on in the past 54 years. Seeing the flow of your code is a lot easier now. Debuggers are amazing things.

While I think his broad point (that code should be as simple and easy to follow as possible) still stands I don't really agree with it here. "goto considered harmful" could be used to argue that anything that changes and obfuscates the flow of a program when you compare the source to the compiled output is bad regardless of what it is, and that's plain silly. We'd have to throw away all manner of useful things like exceptions, macros, inheritance, etc.

I like Dijkstra's writing a lot, and he did groundbreaking work, but we have to remember to consider everything in the context of when it was written. This is a good example of that.

[1] http://www.u.arizona.edu/~rubinson/copyright_violations/Go_T...

Re:You Can Throw() Anything in JavaScript – and Other Async/... by smt88 on Friday April 08, 2022 @12:01PM (#30958896)
> in the context of programming in 1968

I was only pointing out that this is essentially the "original sin" of programming.

It's hardly an issue we've moved beyond, though. It's still one of the most widely-discussed anti-patterns[1] that I've seen in my career. There are dozens of essays and articles saying the same thing.

> Seeing the flow of your code is a lot easier now. Debuggers are amazing things.

There are no tools in any IDE or debugger that make it easier to look at a `throw` line and know all the places it might be caught. It guarantees the need for runtime debugging.

It's actually theoretically impossible to see all `catch` candidates for any particular `throw` in JavaScript because the dynamic nature of the language makes it possible for almost any function to call any other function at runtime.

This is still true in JavaScript of, say, a function call, but a function call can be more certain that its caller will be prepared to handle its output (especially when using TypeScript). When a `catch` is written without knowing all the possible things that can be thrown at it, it's very likely something will be thrown that isn't handled in the catch.

1. https://softwareengineering.stackexchange.com/questions/1892...

Re:You Can Throw() Anything in JavaScript – and Other Async/... by shadowgovt on Friday April 08, 2022 @08:55AM (#30956264)
Yes. In every way that goto is considered harmful it works fine.