ASP.NET Core教程-Exception(异常和错误处理)

news2024/11/27 22:40:35

更新记录
转载请注明出处:
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.coloradmin.cn/o/26976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue.js毕业设计,基于vue.js前后端分离教室预约系统设计与实现(H5移动项目)

功能模块 【后台管理功能模块】 系统设置&#xff1a;设置关于我们、联系我们、加入我们、法律声明 广告管理&#xff1a;设置小程序首页轮播图广告和链接 留言列表&#xff1a;所有用户留言信息列表&#xff0c;支持删除 会员列表&#xff1a;查看所有注册会员信息&#xff0c…

[附源码]计算机毕业设计JAVA家政管理系统

[附源码]计算机毕业设计JAVA家政管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

Spring Boot中Node.js的下载与Vue CLI在IDEA中的部署及使用(图文解释 简单易懂)

仍有问题可点赞关注收藏后在评论区留言~~~ 一、Node.js与npm的下载 在使用Vue CLI(Vue脚手架)搭建前端系统的时候&#xff0c;因为需要用到npm安装Vue CLI&#xff0c;而npm是集成在Node.js中的&#xff0c;所以需要首先安装Node.js Node.js官网 下载过程很简单&#xff0c;…

数据库错误知识集2

Oracle数据库中最常见的索引类型是b-tree索引&#xff0c;也就是B-树索引&#xff0c;以其同名的计算科学结构命名。 union与union all的区别&#xff08;摘&#xff09;&#xff1a; ①对重复结果的处理&#xff1a;union会去掉重复记录&#xff0c;union all不会&#xff1b;…

转铁蛋白偶联糖(单糖/多糖),(Transferrin)TF-PEG-Dextran葡聚糖/Lysozyme溶菌酶

产品名称&#xff1a;转铁蛋白-聚乙二醇-葡聚糖 英文名称&#xff1a;TF-PEG-Dextran 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体&#xff0c;取决于分子量 PEG分子量可选&#xff1a;350、550、750、1k、2k、34k、5k…

校招补一个什么样的项目比较好?

校招一年比一年卷&#xff0c;千军万马过独木桥的情况下该怎样充实自己的项目经历&#xff1f;有两件事要搞明白&#xff01; 一、什么是【好】项目&#xff1f; 好项目在简历上要能一眼看出亮点和提问点。并且要能够把提问点对应的回答准备到位&#xff0c;这样才能在招聘量…

外汇天眼周回顾:Equiti开设最新办事处,Vantage推出Vantage Connect服务

在过去的一周内&#xff0c;国外外汇市场都发生了哪些引人注意的外汇新闻&#xff1f;天眼君带大家一起看看&#xff0c;具体新闻如下&#xff1a; 1、Equiti在塞浦路斯利马索尔开设最新办事处 据悉&#xff0c;多资产经纪商Equiti Group在宣布其在塞浦路斯的新业务获得CySEC …

CRM客户管理系统在市面上这么多?应该如何选型?各行业选型CRM必看!

当您下定决心怎样为您的民营企业选择合适的 CRM 时&#xff0c;须要考量很多不利因素。许多基本上国际标准适用于绝大多数寻求 CRM 软件系统的民营企业。其他注意事宜取决于您的业务体量和性质。下列是任何人 CRM 软件系统中须要注意的 14 项常规事宜&#xff0c;以及许多可能对…

【笑小枫玩转SpringBoot系列】目录,一篇拥有一个系列,值得收藏哟~

本系列简介 本系列主要讲解了JAVA后端开发中常用的操作&#xff0c;以初创一个SpringBoot项目开始&#xff0c;以实例的形式讲解了一个单项目框架的诞生。本文可以做为SpringBoot项目的入门学习&#xff0c;也可以当做一个初建项目的框架。 本文主要使用mysql数据库&#xff0…

Flutter for App——一个简单的BMI计算APP

一个简单的BMI计算APP效果截图初始化布局顶部区域标题计算结果组合顶部区域背景中间区域输入框输入行计算按钮分界线组合中间区域底部区域页面组合BMI计算Toast弹窗效果导入依赖封装效果截图 初始化 初始化表单控制器和焦点节点 void initView(){formKey GlobalKey<FormS…

Unity ECS实例:制作俯视角射击游戏!

目录 创建主角 3&#xff1a;主角移动和摄像机跟随 4&#xff1a;实现敌人角色 5&#xff1a;子弹&#xff0c;死亡&#xff0c;机器人 6&#xff1a;粒子与音效 这次我们来使用Unity ECS系统制作一个俯视角度的射击游戏。虽然现在网上有不少ECS的资料和项目&#xff0c;但…

(十二)Spring IoC注解式开发

文章目录回顾注解注解怎么定义&#xff0c;注解中的属性怎么定义&#xff1f;元注解Target注解Retention注解注解怎么使用&#xff1f;通过反射机制怎么读取注解&#xff1f;Spring注解原理声明Bean的注解Spring注解的使用第一步&#xff1a;加入aop的依赖第二步&#xff1a;在…

1.3 c++虚基类的用途以及内存模型

1.3 虚基类 1.3.1 虚基类(菱形继承)的语法实现 对于如下的继承体系&#xff0c;定义了一个公共基类A。类B和类C都由类A公有派生&#xff0c;类D由类B和类C公有派生。 其示例代码如下所示&#xff0c;这段代码的45行是无法通过编译器的&#xff0c;这即是多重继承存在的一个问…

十二、组合API(2)

本章概要 响应式 API reactive() 方法watchEffect() 方法解构响应性状态深入 watchEffect()refreadonlycomputedwatch 11.3 响应式 API Vue 3.0 的核心功能主要是通过响应式 API 实现的&#xff0c;组合 API 将他们公开为独立的函数。 11.3.1 reactive() 方法 reactive()…

基于物联网的自动灌溉系统的设计与实现

本设计是基于物联网的自动灌溉系统&#xff0c;主要实现以下功能&#xff1a; 1&#xff0c;OLED显示温湿度和土壤温湿度&#xff1b; 2&#xff0c;可通过继电器实现自动灌溉和自动加热的功能&#xff1b; 3&#xff0c;通过lora构建自组网&#xff0c;进行主从机间的数据传输…

正点原子 核心板IMX6ULL IIC RTC驱动 PCF8563

目录前言IIC RTC PCF8563硬件使用IIC设备地址配置 menuconfig 自带PCF8563驱动修改设备树dtb编写应用App测试前言 此篇基于学完【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.6 后&#xff0c;使用核心板进行自行设置。 IIC RTC PCF8563硬件使用 Imx6ul内部的RTC时钟不是很准…

VMware Workstation虚拟机网络相关配置

1、网络配置 1.1、方式一&#xff1a;配置文件 配置文件&#xff1a;网络参数之IP地址与子网掩码、网关地址、DNS 1.1.1、删除旧网卡配置文件 rm -rf /etc/sysconfig/network-scripts/ifcfg-* 1.1.2、grub内核引导程序&#xff0c;定义网卡重新命名规则 vim /etc/default/…

若依vue ruoyi-vue ant design版本使用

若依vue默认是使用element ui的&#xff0c;但是现在大部分项目都用ant design&#xff0c;ant design的组件也比element多&#xff0c;所以最近有想更改成ant design。网上搜了一下&#xff0c;已经有现成的了。 RuoYi-Antdv https://gitee.com/fuzui/RuoYi-Antdv RuoYi-Ant…

【scala】第二章——Scala 变量和数据类型

文章目录1 注释2 变量和常量&#xff08;重点&#xff09;3 标识符的命名规范4 字符串输出5 键盘输入6 数据类型&#xff08;重点&#xff09;7 整数类型&#xff08;Byte、Short、Int、Long&#xff09;8 浮点类型&#xff08;Float、Double&#xff09;9 字符类型&#xff08…

1秒钟搞懂tee和vim文件的使用命令(超级详细)

1秒钟搞懂tee和vim文件的使用命令&#xff08;超级详细&#xff09;一&#xff0c;tee的具体使用1&#xff0c;tee用来显示屏幕并且保存在文件中2&#xff0c;&#xff08;|&#xff09;管道符用来覆盖上一文件内容3&#xff0c;-a用来追加文件内容二&#xff0c;vim的命令模式…