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