重庆熊猫 Loading

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 信息

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<IExceptionHandlerPathFeature>();
    //出现错误的Path
    string exceptionPath = exceptionHandlerPathFeature.Path;
    //出现错误的描述
    string exceptionMessage = exceptionHandlerPathFeature.Error.Message;
    //出现错误的调用栈
    string stackTraceString = exceptionHandlerPathFeature.Error.StackTrace.ToString();
}
posted @ 2022-11-22 09:32  重庆熊猫  阅读(637)  评论(0编辑  收藏  举报