更新记录
转载请注明出处:
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();
}

原文地址:http://www.cnblogs.com/cqpanda/p/16907943.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性