在开发过程中,处理错误是一个重要的方面。ASP.NET Core提供了多种方式来处理错误,以确保应用程序的稳定性和可靠性。

TryCatch

TryCatch是最常见也是最基础的一种异常处理方式,只需要用TryCatch把执行代码包起来,即可捕获异常。
格式如下:

try
{
// 执行操作
doAny();
}
catch (Exception ex)
{
// 处理异常
doExceptionHandling();
}

这属于最基本的异常处理方式,这里就不加上实操代码了。本文主要讲解asp.net core中的其他异常处理方式。

开发人员异常页

ASP.NET Core Web应用在以下情况下默认启用开发人员异常页,用于显示未经处理的请求异常的详细信息。
ASP.NET Core 应用在以下情况下默认启用开发人员异常页:

  • 在开发环境中运行。
  • 使用当前模板创建的应用,即使用 WebApplication.CreateBuilder。 使用 WebHost.CreateDefaultBuilder 创建的应用必须通过在 Configure 中调用 app.UseDeveloperExceptionPage 来启用开发人员异常页。

开发人员异常页运行在中间件管道的前面部分,以便它能够捕获随后中间件中抛出的未经处理的异常。
这里我们新建一个MVC项目,使用WebApplication.CreateBuilder,所以不需要显式调用app.UseDeveloperExceptionPage 来启用开发人员异常页,在HomeController中添加一个Thorw方法直接抛出异常:

using LearnException.Models;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics; namespace LearnException.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
} public IActionResult Index()
{
return View();
} public IActionResult Privacy()
{
return View();
}
public IActionResult Throw()
{
throw new Exception("Customer Excetion");
} [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}

启动项目,然后访问/Home/Throw路径。

可以看到这个页面可以看到我们的详细错误信息,包括异常栈,Query参数, Cookies参数,HTTP请求Headers信息以及路由信息。
这个页面在开发阶段,非常利于我们排查错误。

异常处理程序页

由于我们的一些异常信息不便在非开发环境展示,所以在非开发环境,我们需要一个异常处理程序页。
若要为生产环境配置自定义错误处理页,请调用 UseExceptionHandler。 此异常处理中间件:

  • 捕获并记录未经处理的异常。
  • 使用指示的路径在备用管道中重新执行请求。 如果响应已启动,则不会重新执行请求。 模板生成的代码使用 /Home/Error 路径重新执行请求。

在我们创建的MVC模板的Program中,有这样的代码:

if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
}

表示在非开发环境中启用此异常处理中间件。这里的"/Home/Error"表示跳转到该路由。该路由为异常处理页面。
在模板Views/Shared下面我们可以看到一个Error.cshtml,和Models下面有一个ErrorViewModel,这就是默认的异常处理程序页。
在上面HomeController的代码中我们可以看到一个Error的Action,此Action指向Error页面。我们试试直接起启用app.UseExceptionHandler("/Home/Error"),放开在非开发环境才使用的条件:

//if (!app.Environment.IsDevelopment())
//{
app.UseExceptionHandler("/Home/Error");
//}

分别请求/Home/Error和/Home/Throw路劲


可以看到/Home/Throw也是跳转到Error页面,但是没有详细的异常信息。

自定义异常处理程序页

除了上述的方式,我们在需要自定义异常处理程序页时,可以使用app.UseExceptionHandler的另一个重载方法:

app.UseExceptionHandler(exceptionHandlerApp =>
{
exceptionHandlerApp.Run(async context =>
{
context.Response.StatusCode = StatusCodes.Status500InternalServerError; // using static System.Net.Mime.MediaTypeNames;
context.Response.ContentType = Text.Plain; await context.Response.WriteAsync("An exception was thrown."); var exceptionHandlerPathFeature =
context.Features.Get<IExceptionHandlerPathFeature>(); if (exceptionHandlerPathFeature?.Error is FileNotFoundException)
{
await context.Response.WriteAsync(" The file was not found.");
} if (exceptionHandlerPathFeature?.Path == "/")
{
await context.Response.WriteAsync(" Page: Home.");
}
});
});

在上面代码中exceptionHandlerApp是一个IApplicationBuilder,本质是添加一个终结点中间件去处理响应内容,上面内容包括了修改Http响应的StatusCode,ContentType,以及响应内容。
我们在HomeController中继续添加一个FileNotFound的Action。

public IActionResult FileNotFound()
{
throw new FileNotFoundException();
}

启动项目,分别请求/Home/Throw和/Home/FileNotFound。


可以看到,响应内容和我们配置的一致。
由上面表现,其实我们可以想到,如何自定义一个异常处理中间件。

 public class MyExceptionMiddleware
{
private readonly RequestDelegate _next; public MyExceptionMiddleware(RequestDelegate next)
{
_next = next;
} public async Task Invoke(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex)
{
context.Response.StatusCode = StatusCodes.Status500InternalServerError; // using static System.Net.Mime.MediaTypeNames;
context.Response.ContentType = Text.Plain; await context.Response.WriteAsync("An exception was thrown."); if (ex is FileNotFoundException)
{
await context.Response.WriteAsync(" The file was not found.");
}
}
}
}

在Program添加中间件

app.UseMiddleware<MyExceptionMiddleware>();


可以看到,效果完全一致。
除此之外,我们还有使用ExceptionFilter的方式去处理异常,只要实现实现 IExceptionFilter 或 IAsyncExceptionFilter即可。
添加一个MyExceptionFilter

public class MyExceptionFilter : IAsyncExceptionFilter
{
public async Task OnExceptionAsync(ExceptionContext context)
{
context.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError; // using static System.Net.Mime.MediaTypeNames;
context.HttpContext.Response.ContentType = Text.Plain; await context.HttpContext.Response.WriteAsync("An exception was thrown. by MyExceptionFilter");
context.ExceptionHandled = true;
}
}

在HomeController添加一个Filter的Action。

[TypeFilter(typeof(MyExceptionFilter))]
public IActionResult Filter()
{
throw new Exception("MyExceptionFilter Excetion");
}

启动项目,访问/Home/Filter路径。

可以看到效果跟预想的一致。

ASP.NET Core提供了多种方式来处理错误。开发人员可以根据具体的需求选择适合的错误处理方式,并进行相应的处理和响应。通过合理的错误处理,可以提高应用程序的稳定性和可靠性,提供更好的用户体验。

欢迎进群催更。

asp.net core之异常处理的更多相关文章

  1. asp.net core 自定义异常处理中间件

    asp.net core 自定义异常处理中间件 Intro 在 asp.net core 中全局异常处理,有时候可能不能满足我们的需要,可能就需要自己自定义一个中间件处理了,最近遇到一个问题,有一些异 ...

  2. ASP.NET Core 统一异常处理和返回

    业务场景: 业务需求要求,需要对 ASP.NET Core 异常进行统一处理和返回,比如出现 500 错误和业务服务错误进行不同的处理和返回. 具体实现: using Microsoft.AspNet ...

  3. 【ASP.NET Core】处理异常(下篇)

    上一篇中,老周给大伙伴们扯了有关 ASP.NET Core 中异常处理的简单方法.按照老周的优良作风,我们应该顺着这个思路继续挖掘. 本文老周就不自量力地介绍一下如何使用 MVC Filter 来处理 ...

  4. 【ASP.NET Core】处理异常--转

    老周写的[ASP.NET Core]处理异常非常的通俗易懂,拿来记录下. 转自老周:http://www.cnblogs.com/tcjiaan/p/8461408.html 今天咱们聊聊有关异常处理 ...

  5. ASP.NET Core MVC 中设置全局异常处理方式

    在asp.net core mvc中,如果有未处理的异常发生后,会返回http500错误,对于最终用户来说,显然不是特别友好.那如何对于这些未处理的异常显示统一的错误提示页面呢? 在asp.net c ...

  6. ASP.NET Core 异常处理与日志记录

    1. ASP.NET Core 异常处理与日志记录 1.1. 异常处理 1.1.1. 异常产生的原因及处理 1.1.2. ASP.NET Core中启动开发人员异常页面 1.2. 日志记录 1.2.1 ...

  7. Asp.Net Core异常处理整理

    目前版本是Asp.Net Core v1.1,这个版本的感觉对Http请求中的错误处理方便不是很完善. 没有HttpException异常类,不能在任何的地方自由的抛出对应的异常状态. 一.默认的异常 ...

  8. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

  9. ASP.NET CORE 学习之自定义异常处理

    为什么异常处理选择中间件? 传统的ASP.NET可以采用异常过滤器的方式处理异常,在ASP.NET CORE中,是以多个中间件连接而成的管道形式处理请求的,不过常用的五大过滤器得以保留,同样可以采用异 ...

  10. asp.net core添加全局异常处理及log4net、Nlog应用

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.介绍 此篇文章将会介绍项目的全局异常收集以及采用log4net或者NLog记录. 众所周知,一旦自己的项目报错,如果没有进行处 ...

随机推荐

  1. 想打印k8s资源YAML结果搞懂了Client-Side & Server-Side Apply

    前言 由于查看k8s资源YAML时常看到沉长的YAML与手写的格式,相差甚远不利于阅读,经过探索官方文档,才理解什么是Client-Side & Server-Side Apply. 先看一下 ...

  2. 修改mysql的密码时遇到问题ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corre

    先输入:flush privileges; 再输入:ALTER USER 'root'@'localhost' IDENTIFIED BY 'mysql'; 再输入:flush privileges刷 ...

  3. Django4全栈进阶之路8 createsuperuser创建超级管理员账号

    在 Django 4 中,可以使用 createsuperuser 命令来创建超级管理员账号.超级管理员拥有管理后台的所有权限,包括创建.编辑和删除用户.组.权限等操作. 下面是创建超级管理员账号的步 ...

  4. 【Python&目标识别】调用百度智能云API实现植被识别

           ​百度智能云于2015年正式对外开放运营,以"云智一体"为核心赋能千行百业,致力于为企业和开发者提供全球领先的人工智能.大数据和云计算服务及易用的开发工具.凭借先进的 ...

  5. [Kotlin Tutorials 22] 协程中的异常处理

    协程中的异常处理 Parent-Child关系 如果一个coroutine抛出了异常, 它将会把这个exception向上抛给它的parent, 它的parent会做以下三件事情: 取消其他所有的ch ...

  6. 传统软件如何SaaS化改造,10个问答带你掌握最优解

    摘要:如果您所在企业希望实行SaaS化改造,可访问了解华为云开发者技术团队的SaaS支持计划. 本文分享自华为云社区<[云享问答]第1期:传统软件如何SaaS化改造,10个问答带你掌握最优解!& ...

  7. cmake 安装一个目录下的图片 到另一个目录文件中去

    install(DIRECTORY ./cfg/labels/ DESTINATION ./fservo/cfg/yolo_cfg/labels/) install (DIRECTORY ./cfg/ ...

  8. 手动删除了Linux下syslog--/var/log/messages怎么办?

    引言 Linux小白很容易犯得一个错误就是:查看日志的时候,尤其是系统日志,由于日志太多,把系统日志手动删除了.也就是把/var/log/messages文件删除了,而不是删除文件的内容.直接删除文件 ...

  9. tSNE算法在自然语言处理中的应用:文本降维和可视化

    目录 技术原理及概念 t-SNE(Toeplitz-Stochastic Neural Network)是一种常用的文本降维和可视化算法,它的核心思想是将高维文本数据映射到低维空间,同时保持数据的一致 ...

  10. Python编程和数据科学中的大数据分析:如何从大量数据中提取有意义的信息和模式

    目录 <Python编程和数据科学中的大数据分析:如何从大量数据中提取有意义的信息和模式> 引言 大数据时代已经来临,随着互联网和物联网的普及,海量数据的产生和存储已经成为一种普遍的现象. ...