ASP.NET Core教程-Exception(异常和错误处理)
更新记录
转载请注明出处:
2022年11月22日 发布。
2022年11月20日 从笔记迁移到博客。
错误处理基础
错误处理说明
ASP.NET Core中的错误处理分为:
局部Controller中处理错误
在Controller中定义错误代码和转到错误界面即可
全局应用中设置错误处理
局部Controller中处理错误,要在每个Controller中定义会非常麻烦
并且也没有办法处理路由不匹配的异常处理
MVC应用局部控制器Controller中错误处理
说明
直接设置返回状态码为404,然后返回错误页面即可
实例
public IActionResult Index(int id)
{
//判断记录是否存在
//假设记录不存在
if(false)
{
//设置状态码为404
Response.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 信息
启用该中间件的代码:
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<IExceptionHandlerPathFeature>();
//出现错误的Path
string exceptionPath = exceptionHandlerPathFeature.Path;
//出现错误的描述
string exceptionMessage = exceptionHandlerPathFeature.Error.Message;
//出现错误的调用栈
string stackTraceString = exceptionHandlerPathFeature.Error.StackTrace.ToString();
}
本文来自博客园,作者:重庆熊猫,转载请注明原文链接:https://www.cnblogs.com/cqpanda/p/16907943.html