mirror of
https://github.com/wailsapp/wails.git
synced 2026-03-14 14:45:49 +01:00
Merge pull request #4136 from APshenkin/feature/allow-disable-panic-recovery
Add option to disable panic recovery in message processing
This commit is contained in:
commit
467bbfc4e5
6 changed files with 41 additions and 26 deletions
|
|
@ -221,7 +221,7 @@ func CreateApp(appoptions *options.App) (*App, error) {
|
|||
|
||||
eventHandler := runtime.NewEvents(myLogger)
|
||||
ctx = context.WithValue(ctx, "events", eventHandler)
|
||||
messageDispatcher := dispatcher.NewDispatcher(ctx, myLogger, appBindings, eventHandler, appoptions.ErrorFormatter)
|
||||
messageDispatcher := dispatcher.NewDispatcher(ctx, myLogger, appBindings, eventHandler, appoptions.ErrorFormatter, appoptions.DisablePanicRecovery)
|
||||
|
||||
// Create the frontends and register to event handler
|
||||
desktopFrontend := desktop.NewFrontend(ctx, appoptions, myLogger, appBindings, messageDispatcher)
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ func CreateApp(appoptions *options.App) (*App, error) {
|
|||
ctx = context.WithValue(ctx, "buildtype", "production")
|
||||
}
|
||||
|
||||
messageDispatcher := dispatcher.NewDispatcher(ctx, myLogger, appBindings, eventHandler, appoptions.ErrorFormatter)
|
||||
messageDispatcher := dispatcher.NewDispatcher(ctx, myLogger, appBindings, eventHandler, appoptions.ErrorFormatter, appoptions.DisablePanicRecovery)
|
||||
appFrontend := desktop.NewFrontend(ctx, appoptions, myLogger, appBindings, messageDispatcher)
|
||||
eventHandler.AddFrontend(appFrontend)
|
||||
|
||||
|
|
|
|||
|
|
@ -11,38 +11,42 @@ import (
|
|||
)
|
||||
|
||||
type Dispatcher struct {
|
||||
log *logger.Logger
|
||||
bindings *binding.Bindings
|
||||
events frontend.Events
|
||||
bindingsDB *binding.DB
|
||||
ctx context.Context
|
||||
errfmt options.ErrorFormatter
|
||||
log *logger.Logger
|
||||
bindings *binding.Bindings
|
||||
events frontend.Events
|
||||
bindingsDB *binding.DB
|
||||
ctx context.Context
|
||||
errfmt options.ErrorFormatter
|
||||
disablePanicRecovery bool
|
||||
}
|
||||
|
||||
func NewDispatcher(ctx context.Context, log *logger.Logger, bindings *binding.Bindings, events frontend.Events, errfmt options.ErrorFormatter) *Dispatcher {
|
||||
func NewDispatcher(ctx context.Context, log *logger.Logger, bindings *binding.Bindings, events frontend.Events, errfmt options.ErrorFormatter, disablePanicRecovery bool) *Dispatcher {
|
||||
return &Dispatcher{
|
||||
log: log,
|
||||
bindings: bindings,
|
||||
events: events,
|
||||
bindingsDB: bindings.DB(),
|
||||
ctx: ctx,
|
||||
errfmt: errfmt,
|
||||
log: log,
|
||||
bindings: bindings,
|
||||
events: events,
|
||||
bindingsDB: bindings.DB(),
|
||||
ctx: ctx,
|
||||
errfmt: errfmt,
|
||||
disablePanicRecovery: disablePanicRecovery,
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Dispatcher) ProcessMessage(message string, sender frontend.Frontend) (_ string, err error) {
|
||||
defer func() {
|
||||
if e := recover(); e != nil {
|
||||
if errPanic, ok := e.(error); ok {
|
||||
err = errPanic
|
||||
} else {
|
||||
err = fmt.Errorf("%v", e)
|
||||
if !d.disablePanicRecovery {
|
||||
defer func() {
|
||||
if e := recover(); e != nil {
|
||||
if errPanic, ok := e.(error); ok {
|
||||
err = errPanic
|
||||
} else {
|
||||
err = fmt.Errorf("%v", e)
|
||||
}
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
d.log.Error("process message error: %s -> %s", message, err)
|
||||
}
|
||||
}()
|
||||
if err != nil {
|
||||
d.log.Error("process message error: %s -> %s", message, err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
if message == "" {
|
||||
return "", errors.New("No message to process")
|
||||
|
|
|
|||
|
|
@ -98,6 +98,9 @@ type App struct {
|
|||
|
||||
// DragAndDrop options for drag and drop behavior
|
||||
DragAndDrop *DragAndDrop
|
||||
|
||||
// DisablePanicRecovery disables the panic recovery system in messages processing
|
||||
DisablePanicRecovery bool
|
||||
}
|
||||
|
||||
type ErrorFormatter func(error) any
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue