第三節:使用Log4net和過濾器記錄異常資訊,返回異常給前端
上次面試,遇到,在專案中如何處理業務異常和程式碼異常,使用txt記錄異常資訊後,如何直接區分出異常的型別,異常怎麼分類處理,希望大家能幫我提出寶貴的意見,完善處理異常,
統一返回引數
public class HeaderResult { public HeaderResult() { // ReSharper disable once VirtualMemberCallInConstructor IsSucceed = false; } public virtual bool IsSucceed { get; set; } public virtual string Message { get; set; } public virtual T Result { get; set; } public virtual string StatusCode { get; set; } }
建立一個過濾器
在過濾器中攔截異常資訊,使用Log4net 記錄日誌到txt中,獲取到異常資訊統一返回給前端
public class ProjectExceptionFilter : IExceptionFilter { public void OnException(ExceptionContext context) { Exception exception = context.Exception; var exceptionType = exception.GetType().ToString(); if (exceptionType == "ProjectCore.Common.DomainException") { //用來分類處理業務邏輯 } //獲取controller的名稱 var controller = context.RouteData.Values["controller"].ToString(); //獲取Action的名稱 var action = context.RouteData.Values["Action"].ToString(); var errorPath = controller + "/" + action; LogHelper.LogError("web service error:" + errorPath, exception); //返回異常資訊給前端 context.Result = new JsonResult(new HeaderResult<string> { Message = "錯誤路徑:" + errorPath + ":錯誤資訊" + exception.Message+"", IsSucceed = false }); //異常已處理了 context.ExceptionHandled = true; } } </pre>
使用Log4net 記錄日誌到txt中 log4net.config網上有許多,這裡就不貼出來了
public static class LogHelper { private static ILog _logger; static LogHelper() { ILoggerRepository repository = LogManager.CreateRepository("NETCoreRepository"); XmlConfigurator.Configure(repository, new FileInfo("log4net.config")); LogHelper._logger = LogManager.GetLogger(repository.Name, "NETCorelog4net"); } public static void LogError(string msg, Exception ex) { string errorMsg = string.Format("【丟擲資訊】:{0} <br/>【異常型別】:{1} <br/>【異常資訊】:{2} <br/>【堆疊呼叫】:{3}", new object[] { msg, ex.GetType().Name, ex.Message, ex.StackTrace }); errorMsg = errorMsg.Replace("\r\n", "<br>"); errorMsg = errorMsg.Replace("位置", "<strong style=\"color:red\">位置</strong>"); LogHelper._logger.Error(errorMsg); } public static void LogInfo(string msg) { LogHelper._logger.Info((object)msg); } public static void LogDebug(string msg) { LogHelper._logger.Debug((object)msg); } } </pre>
在Startup 下面配置
services.AddMvc(options => { options.Filters.Add(typeof(ProjectExceptionFilter)); options.Filters.Add(typeof(ModelVerificationFilter)); }). SetCompatibilityVersion(CompatibilityVersion.Version_2_1). AddJsonOptions(options => { //忽略迴圈引用 options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; //不使用駝峰樣式的key options.SerializerSettings.ContractResolver = new DefaultContractResolver(); //設定時間格式 options.SerializerSettings.DateFormatString = "yyyy-MM-dd"; }); </pre>