NetCore实现全局异常捕捉统一处理
做net项目时候,在Global.asax文件中可以通过Application_Error方法全局捕获异常并处理后统一跳转到自定义的错误页面。
下面是我个人在NetCore项目中实现全局捕获异常并统一处理的功能的记录,以便备份。
1、在项目根目录新建文件夹Filter,并在文件夹下新建类,命名为GlobalExceptionFilter.cs
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using CMSCore.Web.Core; namespace CMSCore.Web.Filter
{
public class GlobalExceptionFilter : IExceptionFilter
{
public void OnException(ExceptionContext context)
{
Exception ex = context.Exception;
Log4Net.Error("系统出错", ex);//记录错误日志
context.ExceptionHandled = true; //代表异常已经处理,不会再跳转到开发调试时的异常信息页,可以跳转到我们下面自定义的方法中。若开发过程可以将
该行注释掉,则直接抛出异常调试 //通过HTTP请求头来判断是否为Ajax请求,Ajax请求的request headers里都会有一个key为x-requested-with,值“XMLHttpRequest”
var requestData= context.HttpContext.Request.Headers.ContainsKey("x-requested-with");
bool IsAjax = false;
if (requestData)
{
IsAjax = context.HttpContext.Request.Headers["x-requested-with"] == "XMLHttpRequest" ? true :false;
}
if(!IsAjax)//不是异步请求则跳转页面,异步请求则返回json
{
context.RouteData = new Microsoft.AspNetCore.Routing.RouteData();
context.RouteData.Values.Add("controller", "home");
context.RouteData.Values.Add("action", "error");
context.Result = RedirectHelper.UrlFail(context.RouteData);
}
else
context.Result = RedirectHelper.JsonError(); }
}
}
2、RedirectHelper.cs的代码
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Routing; namespace CMSCore.Web.Core
{ public class RedirectHelper
{ public static AjaxModel AjaxModel(int code,string msg,dynamic data=null,string url=null)
{
return new AjaxModel()
{
Code=code,
Msg=msg,
Data=data,
Url=url
};
}
public static ActionResult JsonError()
{
JsonResult json = new JsonResult(AjaxModel(, "系统出错啦"));
return json;
} public static ActionResult UrlFail(RouteData route)
{
RedirectToActionResult result = new RedirectToActionResult(route.Values["action"].ToString(), route.Values["controller"].ToString(), null);
return result;
} } /// <summary>
/// Json返回结构
/// </summary>
public class AjaxModel
{
public int Code { get; set; }
public string Msg { get; set; }
public object Data { get; set; }
public string Url { get; set; }
} }
3、在Startup.cs中,ConfigureServices方法添加该GlobalExceptionFilter为异常处理机制。
//记得引用对应命名空间
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
}); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
//添加数据库操作上下文
services.AddDbContext<BcmfDBContext>(option => option.UseSqlServer(Configuration.GetConnectionString("DefaultConnectionString")));
//添加全局异常处理机制
services.AddMvc(option=>{
option.Filters.Add<GlobalExceptionFilter>();
});
}
NetCore实现全局异常捕捉统一处理的更多相关文章
- 在Spring Boot中添加全局异常捕捉提示
在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 全局异常捕捉: 新建一个类GlobalDefaultExceptionHandler, 在class注解上@Controll ...
- android中全局异常捕捉
android中全局异常捕捉 只要写代码就会有bug,但是我们要想办法收集到客户的bug.有第三方bugly或者友盟等可以收集.但是,android原生就提供了有关收集异常的api,所以我们来学习一下 ...
- Spring 全局异常捕捉
Spring全局异常捕捉类 注解@ControllerAdvice package com.sicdt.sicsign.web.bill.controller; import org.springfr ...
- springboot(四)拦截器和全局异常捕捉
github代码:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service 全部 ...
- 5.全局异常捕捉【从零开始学Spring Boot】
在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 新建一个类GlobalDefaultExceptionHandler, 在class注解上@ControllerAdvice ...
- 【netcore基础】MVC API全局异常捕捉中间件ExceptionHandlerMiddleWare
项目中想通过统一的接口格式返回异常信息,而不是404 500等HTTP协议层的异常响应 例如 { , , "message":"用户名或密码不正确", &quo ...
- (5)全局异常捕捉【从零开始学Spring Boot】
在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 新建一个类GlobalDefaultExceptionHandler, 在class注解上@ControllerAdvice ...
- Android全局异常捕捉
// 定义自定义捕捉 package com.xiaosw.test; import java.io.File; import java.io.FileOutputStream; import jav ...
- Spring boot之全局异常捕捉
在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 新建一个类GlobalDefaultExceptionHandler, 在class注解上@ControllerAdvice ...
随机推荐
- C#基础 结构体 枚举类型
结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的例子: struct student { public int nianling; public int fen ...
- leetcode126 Word Ladder II
思路: 宽搜过程中分层记录路径,递归还原.实现: class Solution { public: void getPath(string now, string beginWord, string ...
- 3122 奶牛代理商 VIII
3122 奶牛代理商 VIII 时间限制: 3 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 小徐是USACO中国区的奶牛代理商, ...
- Python学习日记之读取中文目录
unicode # -*- coding:utf-8 -*- import os import shutil ins="E:\\学习资料" dir=unicode(ins,'utf ...
- Maven对不同的测试环境用不同的参数进行打包
通过mvn package -P ${env} 加载不同配置文件 1.pom.xml中的配置 filter-dev.properties jdbc.properties
- Java Servlet JSP编程(一)
最近想学学java编程,java现在的应用还是挺广泛的,有必要学习一下. # index.jsp <%@ page language="java" contentType=& ...
- The Runtime Interaction Model for Views-UI布局事件处理流程
The Runtime Interaction Model for Views Any time a user interacts with your user interface, or any t ...
- php第二十二节课
AJAX <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- css3文字渐变无效果的解决方案
现在css3越来月流行了,为了实现一些高大上的效果,我们会用一些渐变的特效,请看文字渐变的特效代码: .title { font-size: 60px; line-height: 80px; text ...
- UVA-1572 Self-Assembly(拓扑排序判断有向环)
题目: 给出几种正方形,每种正方形有无穷多个.在连接的时候正方形可以旋转.翻转. 正方形的每条边上都有一个大写英文字母加‘+’或‘-’.00,当字母相同符号不同时,这两条边可以相连接,00不能和任何边 ...