【C# 基础精讲】自定义异常类

news2025/1/16 17:47:10

在这里插入图片描述

自定义异常类是C#中异常处理的一种重要方式,它允许您创建具有自定义错误信息和处理逻辑的异常类型,以提高程序的可读性和可维护性。通过自定义异常类,您可以为特定的业务逻辑或应用场景创建更有意义的异常,使错误处理更加精确和有效。本文将详细介绍如何创建和使用自定义异常类,并探讨自定义异常类的最佳实践。

1. 为什么要使用自定义异常类?

系统提供了许多内置的异常类型,如InvalidOperationExceptionArgumentNullException等,但在实际开发中,您可能会遇到一些特定的情况,这些内置异常类并不能完全满足您的需求。自定义异常类可以帮助您实现以下目标:

  • 更好的可读性: 自定义异常类可以命名为与业务相关的名称,使错误信息更加清晰明了,有助于快速定位问题。
  • 更精确的错误信息: 自定义异常类可以提供特定错误信息,帮助开发人员更好地理解发生的问题。
  • 添加额外信息: 自定义异常类可以添加额外的属性和方法,用于提供有关异常情况的更多上下文信息。
  • 独立处理逻辑: 自定义异常类可以重写基类中的方法,提供特定的处理逻辑,使错误处理更加准确和灵活。

2. 创建自定义异常类

在C#中,创建自定义异常类非常简单,只需从Exception类派生即可。以下是一个简单的自定义异常类示例:

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

在上述示例中,我们创建了一个名为MyCustomException的自定义异常类,它继承自基类Exception。构造函数接受一个参数,用于设置异常的错误信息。

3. 使用自定义异常类

使用自定义异常类与使用系统内置异常类类似。您可以在代码中引发和捕获自定义异常,以及根据异常类型提供不同的处理逻辑。以下是一个使用自定义异常类的示例:

class BankAccount
{
    private decimal balance = 0;

    public void Withdraw(decimal amount)
    {
        if (amount <= 0)
        {
            throw new InvalidAmountException("提款金额必须大于零。");
        }

        if (amount > balance)
        {
            throw new InsufficientBalanceException("余额不足。");
        }

        balance -= amount;
        Console.WriteLine("成功提款:" + amount);
    }
}

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

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

在上述示例中,BankAccount类的Withdraw方法中引发了两种自定义异常:InvalidAmountExceptionInsufficientBalanceException。这些异常提供了与错误相关的具体错误信息,以及为异常情况提供了特定的处理逻辑。

4. 自定义异常类的最佳实践

4.1 使用有意义的名称

自定义异常类的名称应该清晰明了,能够表达出异常的类型和意图。命名应当符合命名规范,以便开发人员能够理解其用途。

4.2 提供有用的错误信息

自定义异常类的构造函数可以接受参数,用于设置异常的错误信息。这些信息应该简洁明了,能够帮助开发人员快速理解异常的原因。

4.3 添加额外的上下文信息

如果有必要,您可以在自定义异常类中添加额外的属性或方法,用于提供有关异常情况的更多上下文信息。这些信息可以帮助开发人员更好地理解异常的背景和发生的环境。

例如,您可以为自定义异常类添加一个属性来保存引发异常的特定对象:

class InvalidDataException : Exception
{
    public object InvalidObject { get; }

    public InvalidDataException(string message, object invalidObject) : base(message)
    {
        InvalidObject = invalidObject;
    }
}

4.4 考虑异常继承关系

如果您需要创建多个相关的自定义异常类,可以考虑使用继承来建立它们之间的关系。这有助于组织异常类的层次结构,使其更加清晰和有组织。

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

class InsufficientFundsException : PaymentException
{
    public InsufficientFundsException(string message) : base(message)
    {
    }
}

class InvalidPaymentMethodException : PaymentException
{
    public InvalidPaymentMethodException(string message) : base(message)
    {
    }
}

在上述示例中,InsufficientFundsExceptionInvalidPaymentMethodException继承自PaymentException,形成了异常类的层次结构。

4.5 慎重使用自定义异常

尽管自定义异常类提供了更多的灵活性和可读性,但也应慎重使用。不必为每种情况都创建自定义异常,只有在需要为特定的业务逻辑或功能提供更精确的错误处理时,才应考虑创建自定义异常类。

4.6 捕获和处理自定义异常

在使用自定义异常类时,可以像使用系统异常一样捕获和处理它们。以下是一个示例:

try
{
    // 可能引发异常的代码
}
catch (InvalidDataException ex)
{
    Console.WriteLine("无效的数据异常:" + ex.Message);
    Console.WriteLine("无效对象:" + ex.InvalidObject.ToString());
}
catch (PaymentException ex)
{
    Console.WriteLine("支付异常:" + ex.Message);
}
catch (Exception ex)
{
    Console.WriteLine("其他异常:" + ex.Message);
}

5. 总结

自定义异常类是C#中异常处理的强大工具,它允许您为特定的业务逻辑或功能创建更具有意义的异常,提供更精确的错误信息和处理逻辑。通过正确地使用自定义异常类,您可以提高代码的可读性和可维护性,使错误处理更加精确和有效。在创建自定义异常类时,要考虑名称的清晰性、错误信息的有用性、额外上下文信息的添加以及异常继承关系的组织。同时,也要慎重使用自定义异常,只有在确实需要更精确的错误处理时才创建。通过合理使用自定义异常类,您可以构建更健壮、更可靠的应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/885097.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

凸优化基础学习——凸集

凸优化基础学习——凸集 文章内容全部来自对Stephen Boyd and Lieven vandenberghe的Convex Optimization的总结归纳。 电子书资源&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1dP5zI6h3BEyGRzSaJHSodg?pwd0000 提取码&#xff1a;0000 基本概念 仿射集合 **…

JVM中判定对象是否回收的的方法

引用计数法 引用计数法是一种垃圾回收&#xff08;Garbage Collection&#xff09;算法&#xff0c;用于自动管理内存中的对象。在引用计数法中&#xff0c;每个对象都有一个关联的引用计数器&#xff0c;用于记录对该对象的引用数量。 当一个新的引用指向对象时&#xff0c;…

【数据分享】2023年7月全国各城市公交线路与站点数据

公交线路与站点数据是我们做城市研究时经常会用到的基础数据。那么去哪里获取该数据呢&#xff1f;今天&#xff0c;我们就给大家分享一份2023年7月采集的全国所有城市的公交站点与线路数据&#xff0c;数据格式为shp矢量格式。数据来源于开源公交信息查询网站。 数据预览 我…

Netty:ChannelHandler抛出异常,对应的channel被关闭

说明 使用Netty框架构建的socket服务端在处理客户端请求时&#xff0c;每接到一个客户端的连接请求&#xff0c;服务端会分配一个channel处理跟该客户端的交互。如果处理该channel数据的ChannelHandler抛出异常没有捕获&#xff0c;那么该channel会关闭。但服务端和其它客户端…

LeetCode Top100 Liked 题单(序号34~51)

​34. Find First and Last Position of Element in Sorted Array ​ 题意&#xff1a;找到非递减序列中目标的开头和结尾 我的思路 用二分法把每一个数字都找到&#xff0c;最后返回首尾两个数 代码 Runtime12 ms Beats 33.23% Memory14 MB Beats 5.16% class Solution {…

如何借助数字化为企业管理赋能?

数字化可以利用技术简化流程、增强决策并提高整体效率&#xff0c;从而显着增强企业管理能力。以下是有关如何使用数字化赋能企业管理的分步指南&#xff1a; 1.评估当前流程和需求&#xff1a; 了解您当前的业务流程、痛点以及可以从数字化中受益的领域。确定您想要解决的具体…

函数递归专题(案例超详解一篇讲通透)

函数递归 前言1.递归案例:案例一&#xff1a;取球问题案例二&#xff1a;求斐波那契额数列案例三&#xff1a;函数实现n的k次方案例四&#xff1a;输入一个非负整数&#xff0c;返回组成它的数字之和案例五&#xff1a;元素逆置案例六&#xff1a;实现strlen案例七&#xff1a;…

Python爱心光波

文章目录 前言Turtle入门简单案例入门函数 爱心光波程序设计程序分析 尾声 前言 七夕要来啦&#xff0c;博主在闲暇之余创作了一个爱心光波&#xff0c;感兴趣的小伙伴们快来看看吧&#xff01; Turtle入门 Turtle 是一个简单而直观的绘图工具&#xff0c;它可以帮助你通过简…

avue 时间选择器限制时间范围(当天以后的时间、当前月、当前月剩余时间)

时间选择器做项目时必不可少的组件&#xff0c; 今天就简单举几个常用的例子供参考。 <avue-form v-model"form" :option"option"></avue-form><script> export default {data() {return {form:{},option:{column: [{label: "禁止日…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)八:自定义组件封装上

一、本章内容 本章实现一些自定义组件的封装,包括数据字典组件的封装、下拉列表组件封装、复选框单选框组件封装、单选框组件封装、文件上传组件封装、级联选择组件封装、富文本组件封装等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 ![在这里插入图…

阿里云OSS对象存储的核心概念与购买应用

文章目录 1.OSS对象存储基本介绍1.1.OSS对象存储概念1.2.NAS与OSS存储的不同1.3.OSS的应用场景1.4.OSS术语对应表 2.购买OSS存储资源包3.KodCloud云盘接入OSS对象存储3.1.创建Bucket存储空间3.2.创建子用户用于管理Bucket3.3.获取用户的AccessKey3.3.为用户设置权限3.4.将Bucke…

ceph数据分布

ceph的存储是无主结构&#xff0c;数据分布依赖client来计算&#xff0c;有两个条主要路径。 1、数据到PG 2、PG 到OSD 有两个假设&#xff1a; 第一&#xff0c;pg的数量稳定&#xff0c;可以认为保持不变&#xff1b; 第二&#xff0c; OSD的数量可以增减&#xff0c;OSD的…

.NET6导入导出Excel

一、使用NPOI导出Excel //引入NPOI包 HTML <input type"button" class"layui-btn layui-btn-blue2 layui-btn-sm" id"ExportExcel" onclick"ExportExcel()" value"导出" />JS //导出Excelfunction ExportExcel() {…

判断推理 -- 图形推理 -- 属性规律

中心对称&#xff1a;取一个点&#xff0c;穿过中心能找到另一个对称点。把轴对称 中心对称标出来。五角星不是中心对称。 BD对称轴方向相同&#xff0c;但135自带对称轴&#xff0c;24没带&#xff0c;所以6应该不带对称轴。 百分号不是轴对称。 白色对称轴 平行 或者 夹角…

Python项目实战:创建 + 激活虚拟环境

文章目录 步骤一&#xff1a;新建虚拟环境 激活虚拟环境&#xff08;1.1&#xff09;BUG&#xff1a;激活后显示的Python版本与新建时指定的并不相同。&#xff08;1.2&#xff09;激活成功&#xff1a;在Anaconda软件的环境配置中&#xff0c; 将出现一个py39的虚拟环境。 步…

描述符(__get__和__set__和__delete__)

目录 一、描述符 二、描述符的作用 2.1 何时&#xff0c;何地&#xff0c;会触发这三个方法的执行 三、两种描述符 3.1 数据描述符 3.2 非数据描述符 四、描述符注意事项 五、使用描述符 5.1 牛刀小试 5.2 拔刀相助 5.3 磨刀霍霍 5.4 大刀阔斧 5.4.1 类的装饰器:无…

【校招VIP】常见产品分析之微信

考点介绍&#xff1a; 面试对微信功能的分析和提问是非常常见的&#xff0c;一方面需要明确微信自身产品功能的特点和取舍&#xff0c;另一方面也需要与同类的社交APP进行对比思考分析。 『常见产品分析之微信』相关题目及解析内容可点击文章末尾链接查看&#xff01; 一、考…

《2023年度数据安全与管理状况报告》:勒索威胁激增!

上半年发布的《2023年度数据安全与管理状况报告》揭示出数据安全领域的重要趋势和问题。报告显示&#xff0c;勒索活动日益增多&#xff0c;可大多数企业仍然缺乏必要的网络复原策略和数据安全能力来应对威胁并保持业务连续性。 93%的受访者表示&#xff0c;今年勒索软件攻击的…

C语言实现epoll简洁代码

1.1、函数定义 int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);作用&#xff1a; 等待监听的所有fd相应事件的产生。 1.2、参数详解&#xff1a; 1) int epfd&#xff1a; epoll_create()函数返回的epoll实例的句柄。 2) struct epol…

Centos7下python3安装gdal库

Background GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。Github地址&#xff1a;https://github.com/OSGeo/gdal每一个地理空间…