Skip to content

Commit cfa4e9f

Browse files
committed
Add option for custom panic handler
1 parent b068bc1 commit cfa4e9f

File tree

3 files changed

+38
-12
lines changed

3 files changed

+38
-12
lines changed

errors/panic_handler.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package errors
2+
3+
import (
4+
"context"
5+
)
6+
7+
// PanicHandler is the interface used to create custom panic errors that occur during query execution
8+
type PanicHandler interface {
9+
MakePanicError(ctx context.Context, value interface{}) *QueryError
10+
}
11+
12+
// DefaultPanicHandler is the default PanicHandler
13+
type DefaultPanicHandler struct{}
14+
15+
// MakePanicError creates a new QueryError from a panic that occurred during execution
16+
func (h *DefaultPanicHandler) MakePanicError(ctx context.Context, value interface{}) *QueryError {
17+
return Errorf("graphql: panic occurred: %v", value)
18+
}

graphql.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ func ParseSchema(schemaString string, resolver interface{}, opts ...SchemaOpt) (
2828
tracer: trace.OpenTracingTracer{},
2929
validationTracer: trace.NoopValidationTracer{},
3030
logger: &log.DefaultLogger{},
31+
panicHandler: &errors.DefaultPanicHandler{},
3132
}
3233
for _, opt := range opts {
3334
opt(s)
@@ -67,6 +68,7 @@ type Schema struct {
6768
tracer trace.Tracer
6869
validationTracer trace.ValidationTracer
6970
logger log.Logger
71+
panicHandler errors.PanicHandler
7072
useStringDescriptions bool
7173
disableIntrospection bool
7274
}
@@ -126,6 +128,14 @@ func Logger(logger log.Logger) SchemaOpt {
126128
}
127129
}
128130

131+
// PanicHandler is used to customize the panic errors during query execution.
132+
// It defaults to errors.DefaultPanicHandler.
133+
func PanicHandler(panicHandler errors.PanicHandler) SchemaOpt {
134+
return func(s *Schema) {
135+
s.panicHandler = panicHandler
136+
}
137+
}
138+
129139
// DisableIntrospection disables introspection queries.
130140
func DisableIntrospection() SchemaOpt {
131141
return func(s *Schema) {
@@ -197,9 +207,10 @@ func (s *Schema) exec(ctx context.Context, queryString string, operationName str
197207
Schema: s.schema,
198208
DisableIntrospection: s.disableIntrospection,
199209
},
200-
Limiter: make(chan struct{}, s.maxParallelism),
201-
Tracer: s.tracer,
202-
Logger: s.logger,
210+
Limiter: make(chan struct{}, s.maxParallelism),
211+
Tracer: s.tracer,
212+
Logger: s.logger,
213+
PanicHandler: s.panicHandler,
203214
}
204215
varTypes := make(map[string]*introspection.Type)
205216
for _, v := range op.Vars {

internal/exec/exec.go

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,23 @@ import (
2020

2121
type Request struct {
2222
selected.Request
23-
Limiter chan struct{}
24-
Tracer trace.Tracer
25-
Logger log.Logger
23+
Limiter chan struct{}
24+
Tracer trace.Tracer
25+
Logger log.Logger
26+
PanicHandler errors.PanicHandler
2627
}
2728

2829
func (r *Request) handlePanic(ctx context.Context) {
2930
if value := recover(); value != nil {
3031
r.Logger.LogPanic(ctx, value)
31-
r.AddError(makePanicError(value))
32+
r.AddError(r.PanicHandler.MakePanicError(ctx, value))
3233
}
3334
}
3435

3536
type extensionser interface {
3637
Extensions() map[string]interface{}
3738
}
3839

39-
func makePanicError(value interface{}) *errors.QueryError {
40-
return errors.Errorf("graphql: panic occurred: %v", value)
41-
}
42-
4340
func (r *Request) Execute(ctx context.Context, s *resolvable.Schema, op *query.Operation) ([]byte, []*errors.QueryError) {
4441
var out bytes.Buffer
4542
func() {
@@ -177,7 +174,7 @@ func execFieldSelection(ctx context.Context, r *Request, s *resolvable.Schema, f
177174
defer func() {
178175
if panicValue := recover(); panicValue != nil {
179176
r.Logger.LogPanic(ctx, panicValue)
180-
err = makePanicError(panicValue)
177+
err = r.PanicHandler.MakePanicError(ctx, panicValue)
181178
err.Path = path.toSlice()
182179
}
183180
}()

0 commit comments

Comments
 (0)