ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.Net Core2.2异常处理

2020-09-13 21:00:38  阅读:169  来源: 互联网

标签:中间件 public UseExceptionHandler context Net 异常 Response Core2.2


初始化新的项目,在Configure的第一行可以看到如下代码:

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

代码使用 IsDevelopment() 判断了当前是否为开发者模式,然后通过 UseDeveloperExceptionPage() 就跳转到了堆栈错误页面。当然,正式环境的时候可不能这样,所以用 UseExceptionHandler() 这个默认错误处理方法,跳转到了错误提示页面, UseExceptionHandler() 还有一个重载方法使用 lambda 表达式来处理异常:

app.UseExceptionHandler(errorApp =>
{
    errorApp.Run(async context =>
    {
        context.Response.StatusCode = 500;
        context.Response.ContentType = "text/html";
        await context.Response.WriteAsync("<html lang=\"en\"><body>\r\n");
        await context.Response.WriteAsync("ERROR!<br><br>\r\n");

    });
});            

 一、异常过滤器

创建我们自己的异常过滤器需要继承 IAsyncExceptionFilter ,然后实现 OnExceptionAsync 方法对错误信息进行处理:

public class MyCustomerExceptionFilter : IAsyncExceptionFilter
{
    public Task OnExceptionAsync(ExceptionContext context)
    {
        if (context.ExceptionHandled == false)
        {
            string msg = context.Exception.Message;
            context.Result = new ContentResult
            {
                Content = msg,
                StatusCode = StatusCodes.Status200OK,
                ContentType = "text/html;charset=utf-8"
            };
        }
        context.ExceptionHandled = true; //异常已处理了

        return Task.CompletedTask;
    }
}

这里将 context.ExceptionHandled 设置为了true,表示该异常已经被处理,后续的异常处理的中间件也不会再重复处理这个异常了。最后在 Startup.cs 中加入它就可以看:

services.AddControllers(options => options.Filters.Add(new MyCustomerExceptionFilter()));

二、异常中间件

异常中间件和异常过滤器的区别就是,异常中间件的范围更广,异常过滤器只能处理mvc中发生的错误,而中间件可以捕获其之后的所有异常。如下:

public class MyExceptionMiddleware
{
    private readonly RequestDelegate _next;
    public MyExceptionMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    public async Task Invoke(HttpContext httpContext)
    {
        try
        {
            await _next(httpContext);
        }
        catch (Exception ex)
        {
            httpContext.Response.ContentType = "application/problem+json";

            var title = "An error occured: " + ex.Message;
            var details = ex.ToString();

            var problem = new ProblemDetails
            {
                Status = 200,
                Title = title,
                Detail = details
            };

            //Serialize the problem details object to the Response as JSON (using System.Text.Json)
            var stream = httpContext.Response.Body;
            await JsonSerializer.SerializeAsync(stream, problem);
        }
    }
}
app.UseMiddleware<MyExceptionMiddleware>();

不过这样也没啥必要,因为 UseExceptionHandler 的重载方法也可以实现,最开始的时候已经给出了。

 

标签:中间件,public,UseExceptionHandler,context,Net,异常,Response,Core2.2
来源: https://www.cnblogs.com/xwc1996/p/13663085.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有