手机网站模板代码,深圳均安网站制作,华为网站建站,黄河勘测规划设计公司官方建议用app.UseExceptionHandler(/error)来集中处理异常#xff0c;本例是一个具体的应用。比如项目中有一个ViewModel#xff0c;要求Name最大长度为5/// summary/// 用户模型/// /summarypublic class UserModel{/// summary/// ID… 官方建议用app.UseExceptionHandler(/error)来集中处理异常本例是一个具体的应用。比如项目中有一个ViewModel要求Name最大长度为5 /// summary/// 用户模型/// /summarypublic class UserModel{/// summary/// ID/// /summarypublic int ID { get; set; }/// summary///名称/// /summary [MaxLength(5, ErrorMessage 长度不能超过5)]public string Name { get; set; }}
在TestController中有两个Action都有异常的机率Get方法中一个异常是系统内置的0被整除另一个是我们自定义的业务层级异常(.NET架构小技巧8中有涉及);AddUser是有Model验证有可能Name超过5个字符后报异常。Error方法一个错误处理Action根据上下文的异常来分流系统内置异常还是自定业务异常。 /// summary/// get接口/// /summary/// returns/returns[HttpGet]public IActionResult Get(){var ran new Random();switch (ran.Next(1, 4)){case 1:int i 0;var j 10 / i;return Ok();case 2:throw new RegisteredException(这是一个错误);default:return Ok();}}/// summary/// 添加用户接口/// /summary/// param nameuser/param/// returns/returns[HttpPost(/adduser)]public IActionResult AddUser([FromBody] UserModel user){return Ok(user);}/// summary/// 错误处理页/// /summary /// returns/returns[HttpGet(/error)]public IActionResult Error(){var context HttpContext.Features.GetIExceptionHandlerFeature();//如果是业务自定义异常进行特殊处理if (context.Error is DaMeiException){return Problem(detail: context.Error.StackTrace, title: ${context.Error.Message}, type: HIS);}else{return Problem(detail: context.Error.StackTrace, title: context.Error.Message);}}
层级异常类using System;
namespace WebApiError
{/// summary/// 产品异常/// /summarypublic class DaMeiException : ApplicationException{/// summary/// /// /summary/// param namemessage/parampublic DaMeiException(string message) : base(message){}}/// summary/// His项目异常/// /summarypublic class HisException : DaMeiException{/// summary/// /// /summary/// param namemessage/parampublic HisException(string message) : base(message){}}/// summary/// Lis项目异常/// /summarypublic class LisException : DaMeiException{/// summary/// /// /summary/// param namemessage/parampublic LisException(string message) : base(message){}}/// summary/// 模块异常/// /summarypublic class RegisteredException : HisException{/// summary/// /// /summary/// param namemessage/parampublic RegisteredException(string message) : base(message){}}
}
Error的Action之所有调用到是因为Configure中添加如下代码把所有异常交给/error来处理。app.UseExceptionHandler(/error);
添加DaMeiProblemDetailsFactory来兼容各类异常自定义异常和Model验证异常using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using System.Collections.Generic;namespace WebApiError
{/// summary/// /// /summarypublic class DaMeiProblemDetailsFactory : ProblemDetailsFactory{/// summary/// 处理业务错误/// /summary/// param namehttpContext/param/// param namestatusCode/param/// param nametitle/param/// param nametype/param/// param namedetail/param/// param nameinstance/param/// returns/returnspublic override ProblemDetails CreateProblemDetails(HttpContext httpContext, int? statusCode null, string title null, string type null, string detail null, string instance null){var problem new ProblemDetails(){Title string.IsNullOrEmpty(type) ? title : $业务异常错误{title},Detail detail,Status statusCode,Instance instance,Type type};return problem;}/// summary/// 处理model验证错误/// /summary/// param namehttpContext/param/// param namemodelStateDictionary/param/// param namestatusCode/param/// param nametitle/param/// param nametype/param/// param namedetail/param/// param nameinstance/param/// returns/returnspublic override ValidationProblemDetails CreateValidationProblemDetails(HttpContext httpContext, ModelStateDictionary modelStateDictionary, int? statusCode null, string title null, string type null, string detail null, string instance null){var problem new ValidationProblemDetails(){Title Model验证错误,Detail detail,Status statusCode,Instance instance,Type type};foreach (var a in modelStateDictionary){var errorList new Liststring();foreach (var error in a.Value.Errors){errorList.Add(error.ErrorMessage);}problem.Errors.Add(new KeyValuePairstring, string[](a.Key, errorList.ToArray()));}return problem;}}
}
在ConfigureServices中需要注入DaMeiProblemDetailsFactory services.AddTransientProblemDetailsFactory, DaMeiProblemDetailsFactory();
其实还可以用Action过滤器来统一管理异常using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;namespace WebApiError
{/// summary/// 自定义过滤器处理异常/// /summarypublic class DaMeiExceptionFilter : IActionFilter, IOrderedFilter{/// summary/// /// /summarypublic int Order { get; } int.MaxValue - 10;/// summary/// /// /summary/// param namecontext/parampublic void OnActionExecuting(ActionExecutingContext context) { }/// summary/// /// /summary/// param namecontext/parampublic void OnActionExecuted(ActionExecutedContext context){if (context?.Exception ! null){context.Result new ObjectResult(context.Exception.Message){StatusCode 500};context.ExceptionHandled true;} }}
}
另外一种方式是通过Action过滤器来处理using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;namespace WebApiError
{/// summary/// 自定义过滤器处理异常/// /summarypublic class DaMeiExceptionFilter : IActionFilter, IOrderedFilter{/// summary/// /// /summarypublic int Order { get; } int.MaxValue - 10;/// summary/// /// /summary/// param namecontext/parampublic void OnActionExecuting(ActionExecutingContext context){}/// summary/// /// /summary/// param namecontext/parampublic void OnActionExecuted(ActionExecutedContext context){if (context?.Exception ! null){if (context.Exception is DaMeiException){context.Result new ObjectResult(context.Exception.Message){Value $业务异常{ context.Exception.Message},StatusCode 500};}else{context.Result new ObjectResult(context.Exception.Message){Value context.Exception.Message,StatusCode 500};}context.ExceptionHandled true;}}}
}添加全局过滤器services.AddControllers(options
{options.Filters.Add(new DaMeiExceptionFilter());
});