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/8/12 5:22:15 阅读更多 →
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/8/11 1:41:46 阅读更多 →
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/8/11 1:41:46 阅读更多 →

最新新闻

Windows原地升级助手:轻松实现系统版本自由切换

Windows原地升级助手:轻松实现系统版本自由切换

Windows原地升级助手:轻松实现系统版本自由切换 【免费下载链接】In-Place_Upgrade_Helper Helper-Tool for Windows 10/11/Server In-Place-upgrades and changing between Windows Editions 项目地址: https://gitcode.com/GitHub_Trending/in/In-Place_Upgrade…

2026/8/11 23:15:36 阅读更多 →
High Speed Scanner

High Speed Scanner

High Speed Scanner 高速扫描仪

2026/8/11 23:15:36 阅读更多 →
昇腾AI智能体自动管理安卓应用

昇腾AI智能体自动管理安卓应用

针对昇腾Model-Agent模型适配大赛第二季中,基于昇腾(Ascend)与AtomGit AI技术实现安卓手机应用的自动化删除与安装任务,其核心在于构建一个具备环境感知、决策规划和自动化执行能力的智能体(Agent)。该Agen…

2026/8/11 23:15:36 阅读更多 →
能源行业业扩报装自动化方案:基于大模型Agent的电力营销数智化转型实践

能源行业业扩报装自动化方案:基于大模型Agent的电力营销数智化转型实践

在能源行业数字化转型与新型电力系统建设的宏观背景下,业扩报装作为电力营销服务的核心环节,其自动化方案正经历从传统人工流程向数智化驱动的深刻变革。随着《新型电力系统建设“十五五”规划》的发布,电网企业提升营销数字化水平已成为必然…

2026/8/11 23:15:36 阅读更多 →
如何在5分钟内搭建免费Web POS系统:NexoPOS完整实战指南

如何在5分钟内搭建免费Web POS系统:NexoPOS完整实战指南

如何在5分钟内搭建免费Web POS系统:NexoPOS完整实战指南 【免费下载链接】NexoPOS Laravel-based web POS system with Vue.js, Tailwind CSS, inventory management, sales processing, customer records, reports, and modular extension support. 项目地址: ht…

2026/8/11 23:15:35 阅读更多 →
2025年Web开发者三阶段成长指南:从基础技能到全栈架构的完整路线图

2025年Web开发者三阶段成长指南:从基础技能到全栈架构的完整路线图

2025年Web开发者三阶段成长指南:从基础技能到全栈架构的完整路线图 【免费下载链接】developer-roadmap-chinese 2021 年成為 Web 開發人員的路線圖 台灣正體中文版 项目地址: https://gitcode.com/gh_mirrors/de/developer-roadmap-chinese 在技术快速迭代的…

2026/8/11 23:14:35 阅读更多 →

日新闻

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/12 1:11:09 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 1:11:09 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/12 1:11:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/12 1:11:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →