ASP.NET Core教程-Exception(异常和错误处理)
创始人
2024-02-08 03:39:02

更新记录
转载请注明出处:
2022年11月22日 发布。
2022年11月20日 从笔记迁移到博客。

错误处理基础

错误处理说明

ASP.NET Core中的错误处理分为:

​ 局部Controller中处理错误

​ 在Controller中定义错误代码和转到错误界面即可

​ 全局应用中设置错误处理

​ 局部Controller中处理错误,要在每个Controller中定义会非常麻烦

并且也没有办法处理路由不匹配的异常处理

MVC应用局部控制器Controller中错误处理

说明

直接设置返回状态码为404,然后返回错误页面即可

实例

public IActionResult Index(int id)
{//判断记录是否存在//假设记录不存在if(false){//设置状态码为404Response.StatusCode = 404;//返回错误视图View("RecordErrorView", id);}return View();
}

全局应用处理404错误

说明

在ASP.NET Core应用中有两种类型的404错误可能发生:

​ 在控制器中找不到ID

​ 请求的URL和路由不匹配

处理应用404错误中间件

在ASP.NET Core中有统一处理异常的中间件

UseStatusCodePages() 显示404代码和说明给用户

UseStatusPagesWithRedirects() 当出现404错误就跳转到指定的URL

UseStatusPagesWithReExecute() 当出现404错误就跳转到指定的URL,但URL不变

UseStatusPagesWithRedirects()与UseStatusPagesWithReExecute()区别

UseStatusPagesWithRedirects 返回200,而ReExecute()返回404

UseStatusPagesWithRedirects 会改变URL,而ReExecute()不会

UseStatusCodePages()实例

当用户访问不存在的URL会返回404 信息

image

启用该中间件的代码:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseStatusCodePages();}
}

UseStatusPagesWithRedirects()实例

中间件工作原理:

\1. 用户访问不存在的URL,触发404状态码

\2. UseStatusCodePagesWithRedirects()中间件拦截404状态码,并更改为302,跳转即开发人员指定的参数,比如”/Error/404”

\3. 因为使用了重定向,所以URL会发生改变

\4. 请求会经过MVC,最终返回的是200,然后导航到View指定的视图

\5. 整个过程对浏览器来说都是200,没有404的过程

当出现404错误就跳转到指定的URL

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();//出现404错误就跳转到指定的页面app.UseStatusCodePagesWithRedirects("/");}
}

还可以指定参数

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();//出现404错误就跳转到指定的页面app.UseStatusCodePagesWithRedirects("/{0}");}
}

UseStatusPagesWithReExecute()实例

中间件工作原理:

\1. 用户访问不存在的URL,触发404状态码

\2. UseStatusCodePagesWithReExecute()中间件拦截404状态码并重新执行将其执行URL管道,即开发人员指定的参数,比如”/Error/404”

\3. 整个请求经流HTTP管道并由MVC中间件处理,该中间件返回视图的状态码为200

\4. 当响应流出到客户端时,它会通过UseStatusCodePageWithReExecute()中间件将状态码转为404

\5. 因为整个过程只是重新执行管道而不发出重定向请求。所以URL没有变化

当出现404错误就跳转到指定的URL

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();//出现404错误就跳转到指定的页面app.UseStatusCodePagesWithReExecute("/");}
}

还可以指定参数

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();//出现404错误就跳转到指定的页面app.UseStatusCodePagesWithReExecute("/{0}");}
}

全局应用处理全局应用异常

说明

当创建一个ASP.NET Core项目时

在Startup类的Configure方法中已经默认添加了

DeveloperExceptionPageMiddleware中间件

在Startup类的Configure方法中可以看到

如果是开发环境,则加载DeveloperExceptionPage中间件

否则加载ExceptionHandler中间件

处理全局异常中间件

DeveloperExceptionPage 开发环境的异常处理中间件

ExceptionHandler 适合于非开发环境的异常处理中间件

注意:

​ 错误处理中间件应在Configure方法的一开始就添加进来

​ 否则任何在它之前的代码所产生的错误都不会被它们处理

程序员抛出异常

使用throw抛出异常实例即可

public IActionResult Index(int id)
{throw new Exception("Panda666.com");return View();
}

应用全局异常处理实例

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){//开发环境异常处理界面app.UseDeveloperExceptionPage();}else{//非开发环境异常处理//跳转到指定的控制器和动作app.UseExceptionHandler("/Home/Error");//The default HSTS value is 30 days.You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.app.UseHsts();}
}

将异常信息写入到数据库

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
var exceptionHandlerPathFeature = 
HttpContext.Features.Get();//出现错误的Pathstring exceptionPath = exceptionHandlerPathFeature.Path;//出现错误的描述string exceptionMessage = exceptionHandlerPathFeature.Error.Message;//出现错误的调用栈string stackTraceString = exceptionHandlerPathFeature.Error.StackTrace.ToString();
}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...