csharp自定义异常与异常设计建议
1.何时需要自定义异常?在以下情况下应该创建自定义异常:1.业务逻辑错误标准异常无法准确描述业务错误。需要特定的错误信息和处理逻辑。示例:账户余额不足、订单状态无效等。2.需要额外的错误信息标准异常无法提供足够的上下文信息。需要添加自定义属性来存储额外信息。示例:验证失败时需要显示哪些字段有问题。3.需要特定的异常处理调用者需要根据异常类型采取不同的处理措施。标准异常类型不够具体。示例:网络错误vs业务错误需要不同的处理。4.API设计公开的API需要明确的异常类型。让调用者能够清楚地知道可能发生的错误。示例:库或框架提供的异常类型。2.创建自定义异常类自定义异常类必须继承自Exception或其子类。基本结构C#public classCustomException : Exception{public CustomException() :base(){}public CustomException(string message): base(message){}public CustomException(string message, Exception innerException)base(message, innerException){}}C#/// summary///表示余额不足时抛出的异常。/// 包含当前余额和所需金额信息便于调用方处理。/// /summarypublic class InsufficientBalanceException : Exception{/// summary/// 获取当前账户余额。/// /summarypublic decimal CurrentBalance { get; }/// summary/// 获取操作所需的金额。/// /summarypublic decimal RequiredAmount { get; }/// summary/// 初始化异常实例使用当前余额和所需金额构造错误消息。/// /summary/// param namecurrentBalance当前余额/param/// param namerequiredAmount所需金额/parampublic InsufficientBalanceException(decimal currentBalance, decimal requiredAmount): base($余额不足。当前余额:{currentBalance}需要:{requiredAmount}){CurrentBalance currentBalance;RequiredAmount requiredAmount;}/// summary/// 初始化异常实例并指定内部异常。/// /summary/// param namecurrentBalance当前余额/param/// param namerequiredAmount所需金额/param/// param nameinnerException导致当前异常的原始异常/parampublic InsufficientBalanceException(decimal currentBalance, decimal requiredAmount, Exception innerException): base($余额不足。当前余额:{currentBalance}需要:{requiredAmount}, innerException){CurrentBalance currentBalance;RequiredAmount requiredAmount;}}使用示例C#void Withdraw(decimal amount){if (balance amount){throw new InsufficientBalanceException(balance, amount);}balance- amount;}3.异常命名规范自定义异常类应该遵循命名规范:命名规则:类名以Exception结尾。使用描述性的名称清楚地表达异常的含义。使用 PascalCase 命名。说明命名应该清楚地表达异常的含义让调用者能够理解发生了什么错误。4.异常设计原则1.可序列化如果异常需要在不同进程或机器间传递应该标记为可序列化。使用[Serializable]特性。2.提供有意义的错误消息错误消息应该清楚地说明发生了什么错误。包含足够的上下文信息。3.添加自定义属性如果需要额外的错误信息添加自定义属性。属性应该是只读的避免修改。4.提供多个构造函数提供无参构造函数。提供带消息的构造函数。提供带消息和内部异常的构造函数。5.实现序列化支如果标记为可序列化需要实现序列化构造函数。实现GetobjectData方法。5.完整示例:可序列化异常C#using System;using System.Runtime.Serialization;[Serializable]public class ValidationException : Exception{/// summary///获取无效的字段名称数组。/// /summarypublic string[] InvalidFields { get; }/// summary/// 初始化异常实例指定无效字段列表。/// /summary/// param nameinvalidFields无效字段名称数组/parampublic ValidationException(string[] invalidFields): base($验证失败。无效字段:{string.Join(,, invalidFields)}){InvalidFields invalidFields;}/// summary/// 初始化异常实例指定无效字段列表和内部异常。/// summary/// param nameinvalidFields无效字段名称数组/param/// param nameinnerException内部异常/parampublic ValidationException(string[] invalidFields, Exception innerException): base($验证失败。无效字段:{string.Join(,, invalidFields)}, innerException){InvalidFields invalidFields;}/// summary/// 序列化构造函数用于反序列化。/// /summary/// param nameinfo序列化信息/param/// param namecontext流上下文/paramprotected ValidationException(SerializationInfo info, StreamingContext context): base(info, context){InvalidFields (string[])info.GetValue(nameof(InvalidFields), typeof(string[]));}/// summary/// 自定义序列化数据将 InvalidFields 添加到序列化信息中。/// /summary/// param nameinfo序列化信息/param/// param namecontext流上下文/parampublic override void GetObjectData(SerializationInfo info, StreamingContext context){base.GetObjectData(info, context);info.AddValue(nameof(InvalidFields), InvalidFields);}}6.异常使用建议何时使用自定义异常?业务逻辑错误标准异常无法准确描述。需要额外的错误信息。需要特定的异常处理逻辑。公开的API需要明确的异常类型。何时使用标准异常?参数验证错误:使用 ArgumentException、ArgumentNullException。对象状态错误:使用InvalidOperationException。空引用错误:使用NullReferenceException(通常由运行时抛出)。索引越界:使用IndexOutOfRangeException(通常由运行时抛出)。选择建议优先使用标准异常除非有特殊需求。自定义异常应该表示特定的业务错误。避免创建过多的自定义异常类型。7.异常设计最佳实践1.保持简单异常类应该简单只包含必要的属性和方法。避免在异常类中添加复杂的业务逻辑。2.提供足够的上下文错误消息应该包含足够的上下文信息。添加自定义属性存储额外的错误信息。3.文档化异常使用XML注释文档化异常。说明异常的使用场景和触发条件。4.避免过度使用不要为每个错误都创建自定义异常。优先使用标准异常除非有特殊需求。5.考虑异常层次结构如果多个异常有共同特征可以创建基类异常。使用继承来组织异常类型。

相关新闻

风光火储联合调频系统Simulink建模与优化

风光火储联合调频系统Simulink建模与优化

1. 项目背景与核心需求在电力系统频率调节领域,风光火储联合调频系统正成为解决新能源并网问题的关键技术方案。传统电力系统主要依赖火电机组和水电机组进行频率调节,但随着风电、光伏等间歇性能源占比提升,系统惯性降低导致频率波动加剧。我…

2026/10/14 21:30:00 阅读更多 →
KMS智能激活终极指南:3步永久激活Windows和Office的完整教程

KMS智能激活终极指南:3步永久激活Windows和Office的完整教程

KMS智能激活终极指南:3步永久激活Windows和Office的完整教程 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗?Office文档突然…

2026/10/14 11:38:22 阅读更多 →
8月最新AI装机清单|编程、生图、视频赛道模型实测结论,直接抄作业

8月最新AI装机清单|编程、生图、视频赛道模型实测结论,直接抄作业

文章目录前言1 先唠几句掏心窝的1.1 我不是抄稿子的云测评1.2 Claude现在真没必要硬冲了2 AI编程顶配:Codex GPT-5.6 Sol3 国内编程首选:Kimi Code K33.1 这次真不是吹牛皮3.2 现在是我的主力工具之一4 图片生成天花板:GPT Image 24.1 第一…

2026/10/13 4:44:17 阅读更多 →

最新新闻

PDF/Word转PPT自动化工具:AI解析重组与模板驱动实战

PDF/Word转PPT自动化工具:AI解析重组与模板驱动实战

1. 项目概述:为什么我需要一个“PDF/Word转PPT”的自动化工具先别急着看技术细节,说说我为什么折腾这个项目。过去几年,我接手过大量演示文稿制作的需求:季度汇报、行业分析、培训课件、技术方案宣讲。最折磨人的不是内容撰写&…

2026/10/16 14:57:13 阅读更多 →
AI驱动的PDF/Word一键转可编辑PPT:方案设计与落地实践

AI驱动的PDF/Word一键转可编辑PPT:方案设计与落地实践

你平时是不是也经常遇到这种场景:手头有一堆 PDF 文档、Word 资料,领导直接甩过来一句“把这几个文档整理成 PPT,下午开会用”。听到这话,脑子里的第一个念头就是复制粘贴,然后花两三个小时排版对齐,最后交…

2026/10/16 14:57:13 阅读更多 →
GB28181摄像机模拟器:注册保活拉流全链路验证工具

GB28181摄像机模拟器:注册保活拉流全链路验证工具

简介:这是一套面向GB28181国标视频监控系统开发与测试人员的轻量级摄像机模拟工具,专为验证平台侧注册、心跳保活、实时视频流拉取及目录查询等核心交互流程而设计。资源包含5个关键文件:可执行主程序GB28181.exe用于启动模拟器,o…

2026/10/16 14:57:13 阅读更多 →
ArcGIS 10.2.2动态表格扩展模块:制图附表自动刷新实战

ArcGIS 10.2.2动态表格扩展模块:制图附表自动刷新实战

简介:面向 ArcGIS 10.2.2 用户的动态表格与图表扩展模块,Mapping and Charting Solutions 主要用于增强制图环境中的数据表格展示与联动分析,适合 GIS 制图人员、空间分析工程师以及需要在地图中嵌入可交互表格的开发者,可显著提升…

2026/10/16 14:57:13 阅读更多 →
GB28181摄像机模拟器:生产级信令仿真与流媒体测试工具

GB28181摄像机模拟器:生产级信令仿真与流媒体测试工具

简介:这是一套轻量级GB28181国标摄像机软件模拟工具,面向安防监控系统开发者、测试工程师及标准学习者,用于快速验证平台与前端设备间的注册、心跳、视频点播及目录查询等核心交互流程,有效替代真实硬件开展协议调试与兼容性测试。…

2026/10/16 14:57:13 阅读更多 →
CMMI 3.0核心三域落地:治理、基础设施与组织级培训

CMMI 3.0核心三域落地:治理、基础设施与组织级培训

这几年做过程改进咨询和评估,我明显感觉到一件事:CMMI 模型本身越来越不像一套“文档规范”,而更像一套“组织运行逻辑”。尤其是到了 CMMI 3.0,大家讨论最多的不是某个实践域怎么写文档,而是治理、基础设施、组织级培…

2026/10/16 14:56:12 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →