Skip to content

Commit 69c7181

Browse files
authored
Improved error handling and diagnostics (#8616)
1 parent a12d04e commit 69c7181

File tree

108 files changed

+1905
-801
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

108 files changed

+1905
-801
lines changed

src/HotChocolate/Core/src/Execution.Abstractions/Execution/Instrumentation/ErrorKind.cs

Lines changed: 0 additions & 12 deletions
This file was deleted.

src/HotChocolate/Core/src/Execution.Abstractions/Execution/Instrumentation/ICoreExecutionDiagnosticEvents.cs

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,31 @@ public interface ICoreExecutionDiagnosticEvents
1919
/// </returns>
2020
IDisposable ExecuteRequest(RequestContext context);
2121

22+
/// <summary>
23+
/// Called at the end of the execution if an exception occurred at some point,
24+
/// including unhandled exceptions when resolving fields.
25+
/// </summary>
26+
/// <param name="context">
27+
/// The request context encapsulates all GraphQL-specific information about an
28+
/// individual GraphQL request.
29+
/// </param>
30+
/// <param name="error">
31+
/// The last exception that occurred.
32+
/// </param>
33+
void RequestError(RequestContext context, Exception error);
34+
35+
/// <summary>
36+
/// Called when a request termination error occurs within the request pipeline.
37+
/// </summary>
38+
/// <param name="context">
39+
/// The request context encapsulates all GraphQL-specific information about an
40+
/// individual GraphQL request.
41+
/// </param>
42+
/// <param name="error">
43+
/// The GraphQL error object.
44+
/// </param>
45+
void RequestError(RequestContext context, IError error);
46+
2247
/// <summary>
2348
/// Called when starting to parse a document.
2449
/// </summary>
@@ -43,6 +68,18 @@ public interface ICoreExecutionDiagnosticEvents
4368
/// </returns>
4469
IDisposable ValidateDocument(RequestContext context);
4570

71+
/// <summary>
72+
/// Called if there are any document validation errors.
73+
/// </summary>
74+
/// <param name="context">
75+
/// The request context encapsulates all GraphQL-specific information about an
76+
/// individual GraphQL request.
77+
/// </param>
78+
/// <param name="errors">
79+
/// The GraphQL validation errors.
80+
/// </param>
81+
void ValidationErrors(RequestContext context, IReadOnlyList<IError> errors);
82+
4683
/// <summary>
4784
/// Called when starting to coerce variables for a request.
4885
/// </summary>
@@ -82,29 +119,6 @@ public interface ICoreExecutionDiagnosticEvents
82119
/// </returns>
83120
IDisposable ExecuteSubscription(RequestContext context, ulong subscriptionId);
84121

85-
/// <summary>
86-
/// Called when an error occurs during the execution of a GraphQL request.
87-
/// </summary>
88-
/// <param name="context">
89-
/// The request context encapsulates all GraphQL-specific information about an
90-
/// individual GraphQL request.
91-
/// </param>
92-
/// <param name="kind">
93-
/// The kind of error that occurred.
94-
/// </param>
95-
/// <param name="errors">
96-
/// The errors that occurred.
97-
/// </param>
98-
/// <param name="state">
99-
/// An additional state object that can be used to pass additional information
100-
/// to the error diagnostic listener.
101-
/// </param>
102-
void ExecutionError(
103-
RequestContext context,
104-
ErrorKind kind,
105-
IReadOnlyList<IError> errors,
106-
object? state = null);
107-
108122
/// <summary>
109123
/// A GraphQL request document was added to the document cache.
110124
/// </summary>
@@ -145,6 +159,15 @@ void ExecutionError(
145159
/// </param>
146160
void DocumentNotFoundInStorage(RequestContext context, OperationDocumentId documentId);
147161

162+
/// <summary>
163+
/// Called when a request has a non-trusted document when only trusted-documents are allowed.
164+
/// </summary>
165+
/// <param name="context">
166+
/// The request context encapsulates all GraphQL-specific information
167+
/// about an individual GraphQL request.
168+
/// </param>
169+
void UntrustedDocumentRejected(RequestContext context);
170+
148171
/// <summary>
149172
/// A GraphQL request executor was created and is now able to execute GraphQL requests.
150173
/// </summary>

src/HotChocolate/Core/src/Execution.Pipeline/DocumentParserMiddleware.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public async ValueTask InvokeAsync(RequestContext context)
6969
.Build());
7070

7171
context.Result = OperationResultBuilder.CreateError(error);
72-
_diagnosticEvents.ExecutionError(context, ErrorKind.SyntaxError, [error]);
72+
_diagnosticEvents.RequestError(context, ex);
7373
}
7474
}
7575
}

src/HotChocolate/Core/src/Execution.Pipeline/DocumentValidationMiddleware.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public async ValueTask InvokeAsync(RequestContext context)
6565
}
6666

6767
context.Result = OperationResultBuilder.CreateError(result.Errors, resultContextData);
68-
_diagnosticEvents.ExecutionError(context, ErrorKind.ValidationError, result.Errors);
68+
_diagnosticEvents.ValidationErrors(context, result.Errors);
6969
return;
7070
}
7171
}

src/HotChocolate/Core/src/Execution.Pipeline/ExceptionMiddleware.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,19 @@ public async ValueTask InvokeAsync(RequestContext context)
3333
{
3434
var error = _errorHandler.Handle(ErrorHelper.OperationCanceled(ex));
3535
context.Result = OperationResultBuilder.CreateError(error);
36-
_diagnosticEvents.ExecutionError(context, ErrorKind.RequestError, [error]);
36+
_diagnosticEvents.RequestError(context, ex);
3737
}
3838
catch (GraphQLException ex)
3939
{
4040
var errors = _errorHandler.Handle(ex.Errors);
4141
context.Result = OperationResultBuilder.CreateError(errors);
42-
_diagnosticEvents.ExecutionError(context, ErrorKind.RequestError, errors);
42+
_diagnosticEvents.RequestError(context, ex);
4343
}
4444
catch (Exception ex)
4545
{
4646
var error = _errorHandler.Handle(ErrorBuilder.FromException(ex).Build());
4747
context.Result = OperationResultBuilder.CreateError(error);
48-
_diagnosticEvents.ExecutionError(context, ErrorKind.RequestError, [error]);
48+
_diagnosticEvents.RequestError(context, ex);
4949
}
5050
}
5151

src/HotChocolate/Core/src/Execution/DependencyInjection/InternalSchemaServiceCollectionExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ internal static IServiceCollection TryAddDiagnosticEvents(
3535
var listeners = sp.GetServices<IExecutionDiagnosticEventListener>().ToArray();
3636
return listeners.Length switch
3737
{
38-
0 => new NoopExecutionDiagnosticEvents(),
38+
0 => NoopExecutionDiagnosticEvents.Instance,
3939
1 => listeners[0],
4040
_ => new AggregateExecutionDiagnosticEvents(listeners)
4141
};

src/HotChocolate/Core/src/Execution/Extensions/OperationContextExtensions.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ public static OperationContext ReportError(
4848
var errors = new List<IError>();
4949

5050
ReportSingleError(
51-
operationContext.RequestContext,
5251
operationContext.ErrorHandler,
5352
error,
5453
errors);
@@ -58,18 +57,13 @@ public static OperationContext ReportError(
5857
foreach (var handled in errors)
5958
{
6059
operationContext.Result.AddError(handled, selection);
60+
operationContext.DiagnosticEvents.ResolverError(resolverContext, handled);
6161
}
6262

63-
operationContext.DiagnosticEvents.ExecutionError(
64-
operationContext.RequestContext,
65-
ErrorKind.FieldError,
66-
errors);
67-
6863
return operationContext;
6964
}
7065

7166
private static void ReportSingleError(
72-
RequestContext requestContext,
7367
IErrorHandler errorHandler,
7468
IError error,
7569
List<IError> errors,
@@ -89,7 +83,6 @@ private static void ReportSingleError(
8983
foreach (var innerError in aggregateError.Errors)
9084
{
9185
ReportSingleError(
92-
requestContext,
9386
errorHandler,
9487
innerError,
9588
errors,

0 commit comments

Comments
 (0)