28 lines
506 B
Go
28 lines
506 B
Go
package actor
|
|
|
|
import "runtime/debug"
|
|
|
|
type invoker[T any] struct {
|
|
handler func(T)
|
|
onPanic func(T, any, []byte)
|
|
}
|
|
|
|
func (i *invoker[T]) receive(message T) {
|
|
completed := false
|
|
defer func() {
|
|
if !completed {
|
|
value := recover()
|
|
if i.onPanic != nil {
|
|
i.reportPanic(message, value, debug.Stack())
|
|
}
|
|
}
|
|
}()
|
|
i.handler(message)
|
|
completed = true
|
|
}
|
|
|
|
func (i *invoker[T]) reportPanic(message T, value any, stack []byte) {
|
|
defer func() { _ = recover() }()
|
|
i.onPanic(message, value, stack)
|
|
}
|