Skip to content

Commit cb2249a

Browse files
move trace field so can capture recover if panic
1 parent 781aae7 commit cb2249a

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
@@ -43,7 +43,12 @@ type extensionser interface {
4343
}
4444

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

4954
func (r *Request) Execute(ctx context.Context, s *resolvable.Schema, op *query.Operation) ([]byte, []*errors.QueryError) {
@@ -188,11 +193,6 @@ func execFieldSelection(ctx context.Context, r *Request, s *resolvable.Schema, f
188193
var result reflect.Value
189194
var err *errors.QueryError
190195

191-
traceCtx, finish := r.Tracer.TraceField(ctx, f.field.TraceLabel, f.field.TypeName, f.field.Name, !f.field.Async, f.field.Args)
192-
defer func() {
193-
finish(f.out.Bytes(), err)
194-
}()
195-
196196
err = func() (err *errors.QueryError) {
197197
defer func() {
198198
if panicValue := recover(); panicValue != nil {
@@ -206,20 +206,26 @@ func execFieldSelection(ctx context.Context, r *Request, s *resolvable.Schema, f
206206
}
207207
}()
208208

209+
var finish trace.TraceFieldFinishFunc
210+
ctx, finish = r.Tracer.TraceField(ctx, f.field.TraceLabel, f.field.TypeName, f.field.Name, !f.field.Async, f.field.Args)
211+
defer func() {
212+
finish(f.out.Bytes(), err)
213+
}()
214+
209215
if f.field.FixedResult.IsValid() {
210216
result = f.field.FixedResult
211217
return nil
212218
}
213219

214-
if err := traceCtx.Err(); err != nil {
220+
if err := ctx.Err(); err != nil {
215221
return errors.Errorf("%s", err) // don't execute any more resolvers if context got cancelled
216222
}
217223

218224
res := f.resolver
219225
if f.field.UseMethodResolver() {
220226
var in []reflect.Value
221227
if f.field.HasContext {
222-
in = append(in, reflect.ValueOf(traceCtx))
228+
in = append(in, reflect.ValueOf(ctx))
223229
}
224230
if f.field.ArgsPacker != nil {
225231
in = append(in, f.field.PackedArgs)
@@ -258,7 +264,7 @@ func execFieldSelection(ctx context.Context, r *Request, s *resolvable.Schema, f
258264
return
259265
}
260266

261-
r.execSelectionSet(traceCtx, f.sels, f.field.Type, path, s, result, f.out)
267+
r.execSelectionSet(ctx, f.sels, f.field.Type, path, s, result, f.out)
262268
}
263269

264270
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)