Clean Architecture异常处理与全局错误处理:构建健壮的Web API服务
Clean Architecture异常处理与全局错误处理构建健壮的Web API服务【免费下载链接】CleanArchitectureASP.NET Core 6 Web API Clean Architecture Solution Template项目地址: https://gitcode.com/gh_mirrors/cleanarchitecture/CleanArchitecture在构建企业级ASP.NET Core Web API时异常处理是保证系统稳定性和用户体验的关键环节。Clean Architecture解决方案模板提供了一套完整的异常处理机制帮助开发者构建健壮的API服务。本文将为您深入解析Clean Architecture的异常处理体系展示如何实现全局错误处理和优雅的异常响应。为什么异常处理如此重要 ️在分布式系统中异常是不可避免的。没有良好的异常处理机制API可能会泄露敏感信息给客户端返回不一致的错误格式导致客户端无法正确处理错误难以进行问题排查和监控Clean Architecture通过分层架构和统一的异常处理策略解决了这些问题。Clean Architecture异常处理的核心架构1. 异常过滤器全局异常捕获Clean Architecture使用ApiExceptionFilterAttribute作为全局异常过滤器这是异常处理的第一道防线// src/Apps/CleanArchitecture.Api/Filters/ApiExceptionFilterAttribute.cs public class ApiExceptionFilterAttribute : ExceptionFilterAttribute { private readonly IDictionaryType, ActionExceptionContext _exceptionHandlers; public ApiExceptionFilterAttribute() { _exceptionHandlers new DictionaryType, ActionExceptionContext { { typeof(ValidationException), HandleValidationException }, { typeof(NotFoundException), HandleNotFoundException }, { typeof(UnauthorizedAccessException), HandleUnauthorizedAccessException }, { typeof(ForbiddenAccessException), HandleForbiddenAccessException }, }; } }这个过滤器会自动捕获Controller层抛出的所有异常并根据异常类型进行相应的处理。2. 统一的异常类型体系Clean Architecture定义了一系列标准化的异常类型异常类型HTTP状态码使用场景ValidationException400参数验证失败NotFoundException404资源不存在UnauthorizedAccessException401未授权访问ForbiddenAccessException403权限不足ValidateModelException400模型状态验证失败每个异常类型都有明确的职责确保错误信息的准确传达。3. ServiceResult统一的响应格式所有API响应都使用ServiceResultT包装确保响应格式的一致性// src/Common/CleanArchitecture.Application/Common/Models/ServiceResult.cs public class ServiceResultT : ServiceResult { public T Data { get; set; } public ServiceResult(T data) { Data data; } }错误响应包含标准化的错误代码和消息// src/Common/CleanArchitecture.Application/Common/Models/ServiceError.cs public static ServiceError DefaultError new ServiceError(An exception occured., 999); public static ServiceError NotFound new ServiceError(The specified resource was not found., 990); public static ServiceError Validation new ServiceError(One or more validation errors occurred., 900);实战异常处理流程详解第1步配置全局异常过滤器在Startup.cs中注册异常过滤器// src/Apps/CleanArchitecture.Api/Startup.cs services.AddControllers(options options.Filters.AddApiExceptionFilterAttribute()) .AddFluentValidation(x x.AutomaticValidationEnabled false);第2步异常处理中间件配置根据环境配置不同的异常处理策略// src/Apps/CleanArchitecture.Api/Startup.cs if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseMigrationsEndPoint(); } else { app.UseExceptionHandler(/Error); app.UseHsts(); }第3步MediatR管道异常处理Clean Architecture使用MediatR实现CQRS模式通过UnhandledExceptionBehaviour处理应用层异常// src/Common/CleanArchitecture.Application/Common/Behaviours/UnhandledExceptionBehaviour.cs public async TaskTResponse Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegateTResponse next) { try { return await next(); } catch (Exception ex) { var requestName typeof(TRequest).Name; _logger.LogError(ex, CleanArchitecture Request: Unhandled Exception for Request {Name} {Request}, requestName, request); throw; } }完整的异常处理流程示例让我们通过一个用户注册的场景看看异常处理的完整流程1. 参数验证异常当用户提交无效数据时系统会抛出ValidationException// 验证失败时抛出异常 throw new ValidationException(failures);异常过滤器捕获后返回{ succeeded: false, error: { message: One or more validation errors occurred., code: 900 }, errors: { Email: [Email格式不正确], Password: [密码长度至少8位] } }2. 资源不存在异常当查询不存在的用户时// 在服务层 var user await _context.Users.FindAsync(id); if (user null) { throw new NotFoundException($用户 {id} 不存在); }返回响应{ succeeded: false, error: { message: 用户 123 不存在, code: 990 } }3. 权限异常处理当用户尝试访问未授权的资源if (!await _authorizationService.AuthorizeAsync(user, resource, policy)) { throw new ForbiddenAccessException(); }返回响应{ succeeded: false, error: { message: You are not authorized to call this action., code: 998 } }最佳实践与配置建议1. 日志记录策略Clean Architecture集成了Serilog进行结构化日志记录// src/Apps/CleanArchitecture.Api/Program.cs .UseSerilog(((context, configuration) { configuration.Enrich.FromLogContext() .Enrich.WithMachineName() .WriteTo.Console() .WriteTo.Elasticsearch(...) .Enrich.WithProperty(Environment, context.HostingEnvironment.EnvironmentName) .ReadFrom.Configuration(context.Configuration); }))2. 开发与生产环境差异化配置开发环境显示详细错误信息便于调试生产环境隐藏敏感信息记录到日志系统3. 自定义异常扩展您可以根据业务需求扩展异常类型public class BusinessException : Exception { public string ErrorCode { get; } public BusinessException(string message, string errorCode) : base(message) { ErrorCode errorCode; } }然后在异常过滤器中注册处理逻辑。监控与告警健康检查集成Clean Architecture内置健康检查端点services.AddHealthChecks() .AddDbContextCheckApplicationDbContext(); app.UseHealthChecks(/health);异常监控建议集成APM工具如Application Insights、Datadog设置告警规则针对特定错误代码设置告警错误仪表盘监控错误率和趋势常见问题排查Q1为什么我的自定义异常没有被正确处理确保在ApiExceptionFilterAttribute中注册了您的异常类型_exceptionHandlers.Add(typeof(YourCustomException), HandleYourCustomException);Q2如何返回自定义错误消息使用ServiceError.CustomMessage()var details ServiceResult.Failed(ServiceError.CustomMessage(自定义错误消息));Q3如何处理未知异常系统会自动处理未知异常返回500状态码和标准错误信息同时记录详细日志。总结Clean Architecture的异常处理体系提供了一套完整、可扩展的解决方案✅统一响应格式所有API响应遵循相同结构✅分层异常处理从Controller到Application层都有相应的处理机制✅环境感知开发环境提供详细信息生产环境保护敏感数据✅易于扩展支持自定义异常类型和处理逻辑✅完整监控集成结构化日志和健康检查通过这套异常处理机制您可以构建出既健壮又易于维护的Web API服务。记住好的异常处理不仅仅是捕获错误更是提供清晰的错误信息、保持系统稳定性和改善用户体验的关键。现在您已经掌握了Clean Architecture异常处理的精髓开始构建更健壮的API服务吧【免费下载链接】CleanArchitectureASP.NET Core 6 Web API Clean Architecture Solution Template项目地址: https://gitcode.com/gh_mirrors/cleanarchitecture/CleanArchitecture创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

$mol响应式原理详解:为什么它比传统框架快10倍?

$mol响应式原理详解:为什么它比传统框架快10倍?

$mol响应式原理详解:为什么它比传统框架快10倍? 【免费下载链接】mam_mol $mol - fastest reactive micro-modular compact flexible lazy ui web framework. 项目地址: https://gitcode.com/gh_mirrors/ma/mam_mol $mol 作为一款快速响应式的微型…

2026/10/18 18:48:36 阅读更多 →
Windows下Docker+Jenkins搭建Android CI/CD流水线实战

Windows下Docker+Jenkins搭建Android CI/CD流水线实战

1. 为什么要在Windows上搭建Android的Jenkins CI/CD流水线?在移动开发团队中,每次代码提交后手动编译APK、运行单元测试、部署测试环境这些重复性工作会消耗大量时间。我在实际项目中发现,一个中等规模的Android项目,开发人员平均…

2026/10/18 15:29:51 阅读更多 →
nftables-blacklist自动化更新:使用Systemd Timer实现每日自动防护

nftables-blacklist自动化更新:使用Systemd Timer实现每日自动防护

nftables-blacklist自动化更新:使用Systemd Timer实现每日自动防护 【免费下载链接】nftables-blacklist A bash script to ban large numbers of IP addresses published in blacklists. 项目地址: https://gitcode.com/gh_mirrors/ip/nftables-blacklist n…

2026/10/17 21:05:17 阅读更多 →

最新新闻

声音模型空间感外挂:从干声到空间叙事的完整链路

声音模型空间感外挂:从干声到空间叙事的完整链路

1. 从“干声贴脸”到“空间叙事”:为什么你的声音模型需要外挂空间感做声音模型的人,大概都经历过这样一个阶段:模型训练得不错,音色像了,咬字准了,情感也到位了,可把生成结果往耳机里一放&…

2026/10/20 7:30:03 阅读更多 →
Intel Atom Z37xx驱动整合包:Bay Trail平台驱动安装与INF手动指定指南

Intel Atom Z37xx驱动整合包:Bay Trail平台驱动安装与INF手动指定指南

简介:面向维护Intel Atom Z37xx平台设备的工程师与开发者,这份驱动包针对Bay Trail架构平板、超极本及嵌入式设备,解决系统安装后硬件无法识别、功能受限等驱动兼容问题。压缩包共341个文件、约100.74MB,dll动态库、sys内核驱动、…

2026/10/20 7:30:03 阅读更多 →
多账号批量自动发布:如何做到高效发布,又不被限流

多账号批量自动发布:如何做到高效发布,又不被限流

很多做矩阵运营的人,把"批量发布"理解成"一键同步":一套内容复制到所有账号,省时又省力。结果往往是效率没提上去,账号先被限流。问题不在"自动化"本身,而在发布方式触发了平台的风控。…

2026/10/20 7:30:03 阅读更多 →
AI为何难以说“不知道”?工程化教会模型拒绝的实践

AI为何难以说“不知道”?工程化教会模型拒绝的实践

我们经常担心AI会一本正经地胡说八道,却很少去想一个更基础的问题:如果AI根本不知道自己不知道,它连“承认不知道”的机会都没有。让一个由概率采样驱动的大模型开口说“我不知道”,难度比让它写一篇满分作文还高。这篇文章想聊的…

2026/10/20 7:30:03 阅读更多 →
7B大模型端侧部署实战:从量化压缩到160ms推理优化

7B大模型端侧部署实战:从量化压缩到160ms推理优化

最近端侧AI圈确实卷起来了。某头部科技厂商把7B容量级的开源模型放到了移动端跑端侧部署,公开演示里推理延迟压到了160ms左右,这个数字放在一年前是想都不敢想的。要知道,早一年大家还在为1B、3B模型能不能在手机上流畅运行头疼,7…

2026/10/20 7:30:03 阅读更多 →
试用期管理自动化:规则表设计、日期计算与提醒配置

试用期管理自动化:规则表设计、日期计算与提醒配置

简介:面向软件开发者与产品经理的试用期设置演示包,围绕试用天数、使用次数和永久授权三大主题,完整呈现基于Qt框架的授权控制思路,可帮助读者理解注册表与XML配置在试用信息存储中的应用,以及Base64编码与AES加密在防…

2026/10/20 7:29:02 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →