百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

.NET Core Web API 中的异常处理(.net core webapi session)

toyiye 2024-08-17 00:33 13 浏览 0 评论

概述:有效处理异常对于构建健壮且用户友好的应用程序至关重要。本文深入探讨 .NET Core Web API 中的异常处理,演示如何创建自定义异常并全局管理它们,以实现更简洁、更高效的代码库。为什么异常处理很重要正确处理的异常可确保应用程序在所有情况下的行为都具有可预测性。它可以防止向最终用户公开敏感的错误详细信息。它为用户提供有意义的反馈,增强他们的体验。它使代码库更易于维护和调试。构建自定义异常自定义异常允许您更清楚地表达特定的错误条件。让我们为核心 Web API 创建四个自定义异常。NotFoundException当找不到请求的资源时,将引发此异常。public class NotFoun

有效处理异常对于构建健壮且用户友好的应用程序至关重要。本文深入探讨 .NET Core Web API 中的异常处理,演示如何创建自定义异常并全局管理它们,以实现更简洁、更高效的代码库。

为什么异常处理很重要

  • 正确处理的异常可确保应用程序在所有情况下的行为都具有可预测性。
  • 它可以防止向最终用户公开敏感的错误详细信息。
  • 它为用户提供有意义的反馈,增强他们的体验。
  • 它使代码库更易于维护和调试。

构建自定义异常

自定义异常允许您更清楚地表达特定的错误条件。让我们为核心 Web API 创建四个自定义异常。

NotFoundException

当找不到请求的资源时,将引发此异常。

public class NotFoundException : Exception  
{  
    public NotFoundException(string message) : base(message) { }  
}

ValidationException

当数据验证失败时,请使用此选项。

public class ValidationException : Exception  
{  
    public ValidationException(string message) : base(message) { }  
}

UnauthorizedAccessException

指示对资源的未经授权的访问。

public class UnauthorizedAccessException : Exception  
{  
    public UnauthorizedAccessException(string message) : base(message) { }  
}

InternalServerErrorException

表示应用程序中的意外故障。

public class InternalServerErrorException : Exception  
{  
    public InternalServerErrorException(string message) : base(message) { }  
}

全局异常处理

.NET Core 允许全局处理异常,而不是将 try-catch 块分散在整个代码中。这是使用中间件或过滤器完成的。我们将重点介绍如何使用全局筛选器。

public class GlobalExceptionFilter : IExceptionFilter  
{  
    public void OnException(ExceptionContext context)  
    {  
        var statusCode = context.Exception switch  
        {  
            NotFoundException => StatusCodes.Status404NotFound,  
  
            ValidationException => StatusCodes.Status400BadRequest,  
  
            UnauthorizedAccessException => StatusCodes.Status401Unauthorized,  
  
            _ => StatusCodes.Status500InternalServerError  
        };  
  
        context.Result = new ObjectResult(new  
        {  
            error = context.Exception.Message,  
            stackTrace = context.Exception.StackTrace  
        })  
        {  
            StatusCode = statusCode  
        };  
    }  
}

此筛选器将截获异常并将其转换为适当的 HTTP 响应。

注册全局筛选器

在 中,注册全局筛选器。Startup.cs

public void ConfigureServices(IServiceCollection services)  
{  
    services.AddControllers(options =>  
    {  
        options.Filters.Add(new GlobalExceptionFilter());  
    });  
}

引发自定义异常,由 .Net Core Web API 中的全局筛选器捕获 - 图片来源:由作者创建

自定义异常的用法

为了演示 .NET Core Web API 中自定义异常和全局异常筛选器的用法,让我们创建一个简单的示例。这将涉及一个引发这些异常的控制器,演示全局异常筛选器如何捕获和处理这些异常。

[ApiController]  
[Route("[controller]")]  
public class SampleController : ControllerBase  
{  
    [HttpGet("not-found")]  
    public ActionResult GetNotFound()  
    {  
        // Simulate a situation where a resource is not found  
        throw new NotFoundException("The requested resource was not found.");  
    }  
  
    [HttpGet("invalid")]  
    public ActionResult GetInvalid()  
    {  
        // Simulate a validation error  
        throw new ValidationException("Validation failed for the request.");  
    }  
  
    [HttpGet("unauthorized")]  
    public ActionResult GetUnauthorized()  
    {  
        // Simulate unauthorized access  
        throw new UnauthorizedAccessException("You do not have permission to access this resource.");  
    }  
  
    [HttpGet("internal-error")]  
    public ActionResult GetInternalError()  
    {  
        // Simulate an internal server error  
        throw new InternalServerErrorException("An unexpected error occurred.");  
    }  
}

运行 Web API 并向这些终结点发出请求时,将引发相应的自定义异常。

A GET request to /sample/not-found will throw the NotFoundException.

A GET request to /sample/invalid will throw the ValidationException.

当引发这些异常时,全局异常筛选器会捕获它们。然后,它将每个异常映射到相应的 HTTP 状态代码,并向客户端返回结构化响应。

例如,如果引发,筛选器将返回 404 Not Found 状态,其中包含包含错误消息和堆栈跟踪的 JSON 正文。NotFoundException

对全局异常筛选器进行单元测试

测试全局异常筛选器包括检查它是否正确地将异常转换为相应的 HTTP 响应。

若要对此进行测试,可以模拟引发异常的操作方法,然后断言筛选器的响应。使用 Moq 和 xUnit 的示例测试。

public class GlobalExceptionFilterTests  
{  
    [Fact]  
    public void OnException_ShouldSetCorrectStatusCodeForNotFoundException()  
    {  
        // Arrange  
        var exceptionContextMock = new Mock<ExceptionContext>();  
        exceptionContextMock.SetupGet(x => x.Exception).Returns(new NotFoundException("Not found"));  
        var filter = new GlobalExceptionFilter();  
  
        // Act  
        filter.OnException(exceptionContextMock.Object);  
  
        // Assert  
        var objectResult = exceptionContextMock.Object.Result as ObjectResult;  
        Assert.NotNull(objectResult);  
        Assert.Equal(StatusCodes.Status404NotFound, objectResult.StatusCode);  
    }  
}

良好的异常处理可以显著提高软件的质量。

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码