>
> I realize that this thread ended up diverging into a wider discussion of 
> exceptions and error handling in general but I wanted mention one of the 
> problems I discovered and maybe a potential solution for others who may be 
> tempted to play around with something like this.
>
> I originally thought that one of bigger problems with (ab)using panic and 
> recover for control flow and trying to wrap this up in a package would be 
> forgetting to defer the function performing the recover. As mentioned 
> previously I think it's possible to structure things so that it is harder 
> to make this mistake and I think a linter could also be written to catch 
> these cases.
>
> But I think the bigger problem is the function that panics being used 
> after the function with the deferred recover exits or in a different 
> goroutine.
>
> It looks like the Go compiler's escape analysis can be used to detect this 
> though. At least currently. With an inline definition of check and a 
> deferred recover that looks like this:
>
>     var check func(error)
>     {
>         pnc := false
>
>         check = func(ce error) { // watch for "func literal escapes to 
> heap"
>             if ce != nil {
>                 err = ce
>
>                 // Only panic if we haven't previously.
>                 if !pnc {
>                     pnc = true
>                     panic("escaping")
>                 }
>             }
>         }
>
>         defer func() {
>             if pnc {
>                 _ = recover()
>             }
>         }()
>     }
>
>     // Code that uses check.
>
> When compiled with `go build -gcflags -m` if the Go compiler says that the 
> func literal assigned to check escapes to the heap there's a good chance it 
> is being used in a way that won't end well. It even catches uses like this:
>
>     c := make(chan struct{})
>
>     go func() {
>         check(nil)
>
>         close(c)
>     }()
>
>     <-c
>
> where check doesn't out live the function with the deferred recover but it 
> is being used in a different goroutine. So, at least currently, it looks 
> like the compiler can be used to check for unsafe uses of a function like 
> this.
>
> What I'm wondering is are there cases that the compiler won't catch and is 
> this likely to stop working in some future release where, in a block of 
> code like the one above, the compiler will decide that the function doesn't 
> need to escape to the heap?
>
> Michael.
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/d99b705e-d78a-4078-8f8a-ef89a824f58cn%40googlegroups.com.

Reply via email to