Skip to content

Commit bd649a1

Browse files
move trace field so can capture recover if panic
1 parent 785b833 commit bd649a1

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

internal/exec/exec.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,12 @@ type extensionser interface {
4141
}
4242

4343
func makePanicError(value interface{}) *errors.QueryError {
44-
return errors.Errorf("graphql: panic occurred: %v", value)
44+
return &errors.QueryError{
45+
Message: fmt.Sprintf("graphql: panic occurred: %v", value),
46+
Extensions: map[string]interface{}{
47+
"code": 500, "success": false,
48+
},
49+
}
4550
}
4651

4752
func (r *Request) Execute(ctx context.Context, s *resolvable.Schema, op *query.Operation) ([]byte, []*errors.QueryError) {
@@ -181,11 +186,6 @@ func execFieldSelection(ctx context.Context, r *Request, s *resolvable.Schema, f
181186
var result reflect.Value
182187
var err *errors.QueryError
183188

184-
traceCtx, finish := r.Tracer.TraceField(ctx, f.field.TraceLabel, f.field.TypeName, f.field.Name, !f.field.Async, f.field.Args)
185-
defer func() {
186-
finish(f.out.Bytes(), err)
187-
}()
188-
189189
err = func() (err *errors.QueryError) {
190190
defer func() {
191191
if panicValue := recover(); panicValue != nil {
@@ -199,20 +199,26 @@ func execFieldSelection(ctx context.Context, r *Request, s *resolvable.Schema, f
199199
}
200200
}()
201201

202+
var finish trace.TraceFieldFinishFunc
203+
ctx, finish = r.Tracer.TraceField(ctx, f.field.TraceLabel, f.field.TypeName, f.field.Name, !f.field.Async, f.field.Args)
204+
defer func() {
205+
finish(f.out.Bytes(), err)
206+
}()
207+
202208
if f.field.FixedResult.IsValid() {
203209
result = f.field.FixedResult
204210
return nil
205211
}
206212

207-
if err := traceCtx.Err(); err != nil {
213+
if err := ctx.Err(); err != nil {
208214
return errors.Errorf("%s", err) // don't execute any more resolvers if context got cancelled
209215
}
210216

211217
res := f.resolver
212218
if f.field.UseMethodResolver() {
213219
var in []reflect.Value
214220
if f.field.HasContext {
215-
in = append(in, reflect.ValueOf(traceCtx))
221+
in = append(in, reflect.ValueOf(ctx))
216222
}
217223
if f.field.ArgsPacker != nil {
218224
in = append(in, f.field.PackedArgs)
@@ -251,7 +257,7 @@ func execFieldSelection(ctx context.Context, r *Request, s *resolvable.Schema, f
251257
return
252258
}
253259

254-
r.execSelectionSet(traceCtx, f.sels, f.field.Type, path, s, result, f.out)
260+
r.execSelectionSet(ctx, f.sels, f.field.Type, path, s, result, f.out)
255261
}
256262

257263
func (r *Request) execSelectionSet(ctx context.Context, sels []selected.Selection, typ common.Type, path *pathSegment, s *resolvable.Schema, resolver reflect.Value, out *bytes.Buffer) {

0 commit comments

Comments
 (0)