// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { //1 开发人员异常页 显示请求异常的详细信息。置于要捕获其异常的任何中间件前面 //该页包括关于异常和请求的以下信息: //堆栈跟踪 //查询字符串参数(如果有) //Cookie(如果有) //标头 app.UseDeveloperExceptionPage(); } else { //2 异常处理程序页 //为生产环境配置自定义错误处理页,请使用异常处理中间件。 //中间件 //捕获并记录异常。 //在备用管道中为指定的页或控制器重新执行请求。 如果响应已启动,则不会重新执行请求。 app.UseExceptionHandler("/error"); app.UseHsts(); } app.UseExceptionHandler(errApp => { errApp.Run(async context => { //3 访问异常lambda //使用 IExceptionHandlerPathFeature 访问错误处理程序控制器或页中的异常和原始请求路径: var exceptionHandlerPathFeature = context.Features.Get <IExceptionHandlerPathFeature>(); IKnownException knownException = exceptionHandlerPathFeature.Error as IKnownException; if (knownException == null) { var logger = context.RequestServices.GetService <ILogger <MyExceptionFilterAttribute> >(); logger.LogError(exceptionHandlerPathFeature.Error, exceptionHandlerPathFeature.Error.Message); knownException = KnownException.Unknown; context.Response.StatusCode = StatusCodes.Status500InternalServerError; } else { knownException = KnownException.FromKnownException(knownException); context.Response.StatusCode = StatusCodes.Status200OK; } var jsonOptions = context.RequestServices.GetService <IOptions <JsonOptions> >(); context.Response.ContentType = "application/json; charset=utf-8"; await context.Response.WriteAsync(System.Text.Json.JsonSerializer.Serialize(knownException, jsonOptions.Value.JsonSerializerOptions)); }); }); app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
/// <summary> /// 从已知异常信息中重新构造异常信息 /// </summary> /// <param name="exception">已知异常</param> /// <returns>已知异常信息</returns> public static IKnownException FromKnownException(IKnownException exception) { return(new KnownException { Message = exception.Message, ErrorCode = exception.ErrorCode, ErrorData = exception.ErrorData }); }
public void OnException(ExceptionContext context) { IKnownException knownException = context.Exception as IKnownException; if (knownException == null) { knownException = KnownException.Unknown; context.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError; } else { knownException = KnownException.FromKnownException(knownException); context.HttpContext.Response.StatusCode = StatusCodes.Status200OK; } context.Result = new JsonResult(knownException) { ContentType = "application/json; charset=utf-8" }; }
public void OnException(ExceptionContext context) { IKnownException knownException = context.Exception as IKnownException; if (knownException == null) //这是系统异常 { knownException = KnownException.Unknown; context.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError; //系统异常处理,可以写日志等操作,将真正的异常信息保存下来, } else //这是业务异常 { knownException = KnownException.FromKnownException(knownException); context.HttpContext.Response.StatusCode = StatusCodes.Status200OK; } context.ExceptionHandled = true; context.Result = new CustomExceptionResult(knownException.ErrorCode, knownException.Message); }
public override void OnException(ExceptionContext context) { IKnownException knownException = context.Exception as IKnownException; if (knownException == null) { var logger = context.HttpContext.RequestServices.GetService <ILogger <MyExceptionFilterAttribute> >(); logger.LogError(context.Exception, context.Exception.Message); knownException = KnownException.Unknown; context.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError; } else { knownException = KnownException.FromKnownException(knownException); context.HttpContext.Response.StatusCode = StatusCodes.Status200OK; } context.Result = new JsonResult(knownException) { ContentType = "application/json; charset=utf-8" }; }
public void OnException(ExceptionContext context) { IKnownException knownException = context.Exception as IKnownException; if (knownException == null) { var logger = context.HttpContext.RequestServices.GetService <ILogger <CustomerExceptionFilter> >(); logger.LogError(context.Exception, context.Exception.Message); // knownException = KnownException.Unknown; knownException = KnownException.FromKnownException(context.Exception); context.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError; } else { knownException = KnownException.FromKnownException(knownException); context.HttpContext.Response.StatusCode = StatusCodes.Status200OK; } context.Result = new JsonResult(Result <object[]> .Instance(knownException.ErrorData, knownException.Message, knownException.ErrorCode)) //断路器 { ContentType = "application/json; charset=utf-8" }; }
private async Task HandleExceptionAsync(HttpContext httpContext, Exception ex) { // 在 Features 里面获取异常 //var exceptionHandlerPathFeature = httpContext.Features.Get<IExceptionHandlerPathFeature>(); // 1.识别异常是否为业务异常(IKnownException) IKnownException knownException = ex as IKnownException; // 2.为空系统异常,否则业务异常 if (knownException == null) { knownException = KnownException.UnKnown; httpContext.Response.StatusCode = StatusCodes.Status500InternalServerError; } else { knownException = KnownException.FromKnownException(knownException); httpContext.Response.StatusCode = StatusCodes.Status400BadRequest; } // 3.把响应信息通过json 的方式输出出去 httpContext.Response.ContentType = "application/json; charset=utf-8"; await httpContext.Response.WriteAsync(System.Text.Json.JsonSerializer.Serialize(knownException)); }
public static IKnownException FromKnownException(IKnownException exception) { return(new KnownException(errorData: exception.ErrorData, errorCode: exception.ErrorCode, message: exception.Message)); }
public static IKnownException FromKnownException(IKnownException exception) { return(new KnownException(exception.Message, exception.ErrorCode)); }
public static IKnownException FromKnownException(IKnownException knownException) { return(new KnownException { Code = knownException.Code, Msg = knownException.Msg, Data = knownException.Data }); }