11using System . Net ;
22using Microsoft . AspNetCore . Mvc . Filters ;
33using Initium . Exceptions ;
4+ using Initium . Helpers ;
45using Initium . Response ;
56
67namespace Initium . Filters ;
@@ -20,39 +21,29 @@ public void OnException(ExceptionContext context)
2021 {
2122 // Start building the ApiResponse using the Fluent Builder
2223 var apiResponseBuilder = ApiResponseBuilder . CreateFromContext ( context . HttpContext ) ;
23-
24- // Use pattern switch to handle exceptions
25- context . Result = context . Exception switch
24+
25+ // Determine the HTTP status code:
26+ var statusCode = context . Exception switch
2627 {
27- ApiException ex => apiResponseBuilder
28- . WithMessage ( ex . Message )
29- . WithStatusCode ( ex . StatusCode )
30- . BuildAsJsonResult ( ) ,
31-
32- NotImplementedException ex => apiResponseBuilder
33- . WithMessage ( ex . Message )
34- . WithStatusCode ( HttpStatusCode . NotImplemented )
35- . BuildAsJsonResult ( ) ,
36-
37- _ => apiResponseBuilder
38- . WithMessage ( "An unexpected error occurred." )
39- . WithStatusCode ( HttpStatusCode . InternalServerError )
40- . BuildAsJsonResult ( )
28+ ApiException exception => exception . StatusCode ,
29+ NotImplementedException => HttpStatusCode . NotImplemented ,
30+ _ => HttpStatusCode . InternalServerError
4131 } ;
4232
33+ // Determine the response message:
34+ // 1. Use the exception's message if it's not null or whitespace.
35+ // 2. Otherwise, get the message from [ApiResponse] attributes.
36+ // 3. If none is found, use the default message for the StatusCode.
37+ var message =
38+ ( string . IsNullOrWhiteSpace ( context . Exception . Message ) ? null : context . Exception . Message )
39+ ?? ApiResponseHelper . GetApiResponseMessage ( context . ActionDescriptor , statusCode )
40+ ?? ApiResponseHelper . GetDefaultMessageForStatusCode ( statusCode ) ;
41+
42+ // Construct a standardized ApiResponse object including HTTP context details.
4343 context . ExceptionHandled = true ;
44+ context . Result = apiResponseBuilder
45+ . WithStatusCode ( statusCode )
46+ . WithMessage ( message )
47+ . BuildAsJsonResult ( ) ;
4448 }
45- }
46- //
47- // public static implicit operator ActionResult(ServiceResult result)
48- // {
49- // if (result.Success && result.StatusCode == HttpStatusCode.NoContent)
50- // {
51- // return new NoContentResult();
52- // }
53- //
54- // return new ObjectResult(result)
55- // {
56- // StatusCode = (int)result.StatusCode
57- // };
58- // }
49+ }
0 commit comments