You can configure your schema to rescue application errors during field resolution. Errors during batch loading will also be rescued.
Thanks to @exAspArk
for the graphql-errors
gem which inspired this behavior and @thiago-sydow
who suggested an implementation like this.
Handlers are added with rescue_from
configurations in the schema:
class MySchema < GraphQL::Schema
# ...
rescue_from(ActiveRecord::RecordNotFound) do |err, obj, args, ctx, field|
# Raise a graphql-friendly error with a custom message
raise GraphQL::ExecutionError, "#{field.type.unwrap.graphql_name} not found"
end
rescue_from(SearchIndex::UnavailableError) do |err, obj, args, ctx, field|
# Log the error
Bugsnag.notify(err)
# replace it with nil
nil
end
end
The handler is called with several arguments:
err
is the error that was raised during field execution, then rescuedobj
is the object which was having a field resolved against itargs
is the Hash of arguments passed to the resolverctx
is the query contextfield
is the GraphQL::Schema::Field
instance for the field where the error was rescuedInside the handler, you can:
GraphQL::ExecutionError
to return to the usererr
to crash the query and halt execution. (The error will propagate to your application, eg, the controller.)