Skip to main content

Error Handling

Resolver errors​

When a resolver throws an exception, GQLXY catches it, sets the field value to null, and appends a structured error to the errors array. Execution continues for all other fields.

Schema schema({
.typeDefs = R"(
type Query {
user: User
config: String
}

type User {
id: ID!
name: String!
}
)",
.resolvers = {
{"Query", Resolver{
{"user", FunctionResolver{[](const ResolverArgs&) -> ValueResolver {
throw std::runtime_error("User not found");
}}},
{"config", "production"}
}}
}
});

auto result = schema.Resolve({
.query = R"({
user {
name
}
config
})"
}).get();

Response:

{
"data": {
"user": null,
"config": "production"
},
"errors": [
{
"message": "User not found",
"path": ["user"]
}
]
}

Error paths​

The path array traces the exact field that failed. Nested errors include every level:

{"profile", Resolver{
{"avatar", FunctionResolver{[](const ResolverArgs&) -> ValueResolver {
throw std::runtime_error("CDN unavailable");
}}}
}}
{
"errors": [
{
"message": "CDN unavailable",
"path": ["profile", "avatar"]
}
]
}

Partial results​

Data and errors are always returned together. If some fields succeed and others fail, the response contains both a partial data object and an errors array:

if (result.data) { /* process result.data.value() */ }
if (result.errors) { /* log result.errors.value() */ }

Validation errors​

Before execution, GQLXY validates the query against the schema. Validation errors are returned in errors without any data:

{ nonExistentField }
{
"errors": [
{
"message": "Cannot query field \"nonExistentField\" on type \"Query\""
}
]
}

Common validation errors:

SituationError message
Querying a field that doesn't existCannot query field "X" on type "Y"
Variable used but not declaredVariable "$X" is not declared in the operation
Required variable not providedVariable "$X" of type "T!" was not provided
Required field argument missingArgument "X" of field "Y.Z" is required

Serializing the response​

If you want to transform the GraphQLResponse to JSON, you can use the Serialize method to produce the standard GraphQL JSON envelope:

#include <gqlxy/results.h>

auto result = schema.Resolve({.query = query}).get();
nlohmann::json response = gqlxy::Serialize(result);
// { "data": {...}, "errors": [...] }

data is omitted when there are only validation errors. errors is omitted when there are none.