Earlier quoted context omitted.
Go panics should not be used for very common errors .
A lot of very common operations can panic: division, dereferencing a pointer, invoking an interface method, indexing/slicing an array/slice/string, asserting the type of an interface, and converting a slice to pointer to array. It’s possible to check, but I’ve never seen a tool that verifies you never use any of these without checking. You also have to check for nil channels, though they block forever (maybe consumin…
Conc: Better Structured Concurrency for Go
141–150 of 162 posts
Re: Conc: Better Structured Concurrency for Go
#142Earlier quoted context omitted.
> Index slice out of bounds? panic. Close a channel twice? Panic. Incorrect type assertion? Panic. Dereference nil pointer? Panic. These are all really bad things which should never survive to production code. It is not difficult to detect and prevent them. > I would argue that all of these examples which are the most common in my experience are “goroutine scoped” because the goroutine was aborted before they potenti…
> These are all really bad things which should never survive to production code. It is not difficult to detect and prevent them. This is equivalent to saying "out of bounds memory writes are not difficult to detect and prevent in C code". Like actually equivalent (possibly worse), not just "well if you squint they look similar". Of course it's not hard most of the time . Being perfect is beyond hard though. And if yo…
Re: Conc: Better Structured Concurrency for Go
#143Earlier quoted context omitted.
Since defers run during panics for exactly this reason, no. You can in fact guarantee that is not the case. Runtime-safety "panics" in Go, like concurrently modifying and iterating a map that can lead to other memory being corrupted, tend to abort the whole process immediately and not be suppress-able panics.
> Runtime-safety "panics" in Go, like concurrently modifying and iterating a map that can lead to other memory being corrupted, tend to abort the whole process immediately and not be suppress-able panics. https://go.dev/doc/effective_go#panic > The usual way to report an error to a caller is to return an error as an extra return value. . . . But what if the error is unrecoverable? Sometimes the program simply cannot…
Re: Conc: Better Structured Concurrency for Go
#144Earlier quoted context omitted.
The problem also affects structs that happen to have a private map or cache or callback anywhere within. https://go.dev/play/p/uP-vjpvuhku
Obviously `interface{}` values are not comparable?
Re: Conc: Better Structured Concurrency for Go
#145Earlier quoted context omitted.
> Runtime-safety "panics" in Go, like concurrently modifying and iterating a map that can lead to other memory being corrupted, tend to abort the whole process immediately and not be suppress-able panics. https://go.dev/doc/effective_go#panic > The usual way to report an error to a caller is to return an error as an extra return value. . . . But what if the error is unrecoverable? Sometimes the program simply cannot…
That's a style decision, not a correctness issue. You are claiming it is a correctness issue.
Re: Conc: Better Structured Concurrency for Go
#146Earlier quoted context omitted.
> I guess this is the crux of the issue. I don't think this is true, or needs to be true. It certainly hasn't been my experience. I think assuming panics are normal will take you down some paths that make it basically impossible to write reliable software. But, to each their own. I'd rather have the control to log the panic on a service rather than it forcibly dying and taking down any other connections with it. Kube…
I don't think I'm effectively communicating the impact of handling a panic and continuing program execution. A panic that comes from a memory model violation (as one example) can change the value of anything in the memory space of the program. If the program continues, that change will go undetected, and can have results that make the program completely nondeterministic. This isn't a doom and gloom, sky-is-falling pr…
I do not think you are correct. Go has a class of unrecoverable panics for this specific reason. Go also runs deferred functions after a recoverable panic, so the notion that it's unsafe to handle it, or continue executiona after doesn't hold at all - it is literally a first-class feature of the language.
I have not seen an instance of a recoverable panic that is raised _after_ such a fatal operation. If you have an example of such, I would love to see it.
Re: Conc: Better Structured Concurrency for Go
#147Earlier quoted context omitted.
I don't think I'm effectively communicating the impact of handling a panic and continuing program execution. A panic that comes from a memory model violation (as one example) can change the value of anything in the memory space of the program. If the program continues, that change will go undetected, and can have results that make the program completely nondeterministic. This isn't a doom and gloom, sky-is-falling pr…
> A panic that comes from a memory model violation (as one example) can change the value of anything in the memory space of the program ... This isn't a doom and gloom, sky-is-falling prognostication, it's literally what is defined by the spec and memory model of the language. I do not think you are correct. Go has a class of unrecoverable panics for this specific reason. Go also runs deferred functions after a recov…
Re: Conc: Better Structured Concurrency for Go
#148Earlier quoted context omitted.
> A panic that comes from a memory model violation (as one example) can change the value of anything in the memory space of the program ... This isn't a doom and gloom, sky-is-falling prognostication, it's literally what is defined by the spec and memory model of the language. I do not think you are correct. Go has a class of unrecoverable panics for this specific reason. Go also runs deferred functions after a recov…
What are unrecoverable panics vs. recoverable panics? Where is that distinction defined?
As far as the user/developers are concerned, it doesn't matter too much, since you have no option to recover them, but it would be nice if it was explained if defers are still ran. I'm assuming they are not.
1. https://stackoverflow.com/questions/57486620/are-all-runtime...
Re: Conc: Better Structured Concurrency for Go
#149Earlier quoted context omitted.
What are unrecoverable panics vs. recoverable panics? Where is that distinction defined?
There seems to not be any standard list of unrecoverable panics/aborts, but this Stackoverflow post [1] has a list of a few. As far as the user/developers are concerned, it doesn't matter too much, since you have no option to recover them, but it would be nice if it was explained if defers are still ran. I'm assuming they are not. 1. https://stackoverflow.com/questions/57486620/are-all-runtime...
Re: Conc: Better Structured Concurrency for Go
#150Earlier quoted context omitted.
There seems to not be any standard list of unrecoverable panics/aborts, but this Stackoverflow post [1] has a list of a few. As far as the user/developers are concerned, it doesn't matter too much, since you have no option to recover them, but it would be nice if it was explained if defers are still ran. I'm assuming they are not. 1. https://stackoverflow.com/questions/57486620/are-all-runtime...
If there is no way for callers to reliably distinguish recoverable panics from unrecoverable panics, then this distinction doesn't really exist, does it? Panics are panics.
Of course you cannot distinguish between unrecoverable and recoverable panics, because by definition an unrecoverable panic is not recoverable. There is no caller to distinguish between it - it is killed.