C# 异常处理全解析


.NET学习资料

.NET学习资料

.NET学习资料


在 C# 编程中,异常处理是一项至关重要的技术,它能够确保程序在面对各种意外情况时仍能稳定运行。本文将深入探讨 C# 异常处理的相关知识。

一、什么是异常

异常是程序在运行过程中发生的错误或意外情况。当程序执行遇到无法正常处理的状况时,就会抛出一个异常,以通知程序出现了问题。异常是一种特殊的事件,若不加以捕获和处理,程序可能会崩溃或意外终止。常见的异常类型有:

DivideByZeroException:当进行除法运算时,若除数为零,就会抛出此异常。

NullReferenceException:尝试访问空引用对象的成员或调用空引用对象的方法时,会引发该异常。

IndexOutOfRangeException:在访问数组、集合等具有索引的对象时,如果索引超出了有效范围,就会抛出此异常。

FileNotFoundException:当试图访问一个不存在的文件时,会出现这个异常。

二、为何需要异常处理

在程序编写过程中,错误的发生难以完全避免。例如,用户可能会输入不符合预期的数据,网络连接可能会突然中断,文件可能在运行时丢失等。倘若不对这些异常情况进行处理,程序就会直接崩溃,这将给用户带来极差的体验。通过异常处理,我们可以实现以下几点:

捕获异常:在检测到错误时,防止程序立即崩溃,使程序有机会进行后续处理。

处理异常:针对不同类型的异常,采取相应的措施,让程序能够继续运行,或者以友好的方式退出。

提供反馈:向用户展示有用的错误信息,这不仅有助于用户了解问题所在,也方便开发者进行调试和程序改进。

三、异常处理的关键字

C# 中异常处理主要借助以下关键字来实现:

try:用于包裹可能产生异常的代码块。在try块中执行的代码,一旦出现异常,就会被后续的catch块捕获。

catch:负责捕获try块中抛出的异常,并对其进行相应的处理。可以根据不同的异常类型,编写多个catch块来分别处理。

finally:无论try块中是否发生异常,finally块中的代码都会被执行。通常用于执行一些资源清理操作,比如关闭文件、释放数据库连接等。

throw:允许开发者主动抛出一个异常,以便在特定的业务逻辑下,通知程序出现了需要特殊处理的情况。

四、异常处理的基本结构

C# 异常处理的基本结构如下:

try
{
    // 可能产生异常的代码
}
catch (ExceptionType ex)
{
    // 对异常进行处理的代码
}
finally
{
    // 无论是否发生异常,都会执行的代码
}

在这个结构中:

try块包含了可能会引发异常的代码段。

catch块紧跟在try块之后,用于捕获并处理特定类型的异常。ExceptionType表示要捕获的异常类型,ex是一个异常对象,通过它可以获取异常的详细信息。

finally块是可选的,它里面的代码无论try块中是否发生异常,都会被执行。常用于执行一些必须执行的清理操作,确保资源的正确释放。

五、实例解析异常和异常处理

5.1 未处理异常的情况

using System;

class Program
{
    static void Main()
    {
        int a = 10;
        int b = 0;
        int result = a / b; // 除以零,抛出异常
        Console.WriteLine("结果是:" + result);
    }
}

在这段代码中,由于进行了除以零的操作,会抛出DivideByZeroException异常。由于没有对该异常进行处理,程序会直接崩溃,并输出异常信息:Unhandled Exception: System.DivideByZeroException: Attempted to divide by zero.

5.2 使用异常处理

using System;

class Program
{
    static void Main()
    {
        int a = 10;
        int b = 0;
        try
        {
            int result = a / b; // 可能引发异常的代码
            Console.WriteLine("结果是:" + result);
        }
        catch (DivideByZeroException ex)
        {
            Console.WriteLine("发生错误:不能除以零!");
            // 可以根据需要输出异常信息
            // Console.WriteLine(ex.Message);
        }
    }
}

在这个例子中,try块包含了可能发生异常的代码int result = a / b;。当b为零时,会抛出DivideByZeroException异常。catch块捕获到该异常,并执行其中的代码,输出提示信息发生错误:不能除以零!。此时程序不会崩溃,可以继续执行后续的代码。

5.3 使用finally块

using System;
using System.IO;

class Program
{
    static void Main()
    {
        StreamReader sr = null;
        try
        {
            sr = new StreamReader("test.txt");
            string content = sr.ReadToEnd();
            Console.WriteLine(content);
        }
        catch (FileNotFoundException ex)
        {
            Console.WriteLine("文件未找到!");
        }
        finally
        {
            // 无论是否发生异常,都要关闭文件
            if (sr!= null)
            {
                sr.Close();
                Console.WriteLine("文件已关闭。");
            }
        }
    }
}

在这段代码中,try块尝试读取文件test.txt。如果文件不存在,会抛出FileNotFoundException异常,并被catch块捕获。finally块中的代码会在try和catch块执行完后执行,用于关闭文件等清理操作。即使发生异常,finally块仍然会执行,确保文件资源被正确释放。

5.4 使用throw关键字

using System;

class Program
{
    static void Main()
    {
        try
        {
            CheckAge(15);
        }
        catch (Exception ex)
        {
            Console.WriteLine("错误:" + ex.Message);
        }
    }

    static void CheckAge(int age)
    {
        if (age < 18)
        {
            throw new Exception("未成年人禁止入内!");
        }
        else
        {
            Console.WriteLine("欢迎光临!");
        }
    }
}

在CheckAge方法中,如果age小于 18,就会使用throw关键字主动抛出一个Exception异常。在Main方法中,调用CheckAge(15)时,由于age为 15,会抛出异常。catch块捕获到该异常,并输出错误信息错误:未成年人禁止入内!

六、自定义异常

在某些情况下,C# 内置的异常类型可能无法满足特定的业务需求。此时,我们可以自定义异常类型。自定义异常通常继承自Exception类或它的子类。例如:

using System;

// 自定义异常类
class MyCustomException : Exception
{
    public MyCustomException(string message) : base(message)
    {
    }
}

class Program
{
    static void Main()
    {
        try
        {
            DoSomething();
        }
        catch (MyCustomException ex)
        {
            Console.WriteLine("自定义异常:" + ex.Message);
        }
    }

    static void DoSomething()
    {
        // 模拟某种业务逻辑,满足特定条件时抛出自定义异常
        if (DateTime.Now.Hour < 12)
        {
            throw new MyCustomException("上午时间不允许执行此操作!");
        }
        else
        {
            Console.WriteLine("操作成功执行!");
        }
    }
}

在这个例子中,我们定义了一个MyCustomException类,它继承自Exception类。在DoSomething方法中,根据当前时间是否在上午来决定是否抛出自定义异常。在Main方法中,通过catch块捕获并处理这个自定义异常。

通过以上对 C# 异常处理的全面介绍,希望能帮助开发者更好地掌握这一重要的编程技术,编写出更加健壮、稳定的程序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数学】矩阵、向量(内含矩阵乘法C++)

目录 一、前置知识&#xff1a;向量&#xff08;一列或一行的矩阵&#xff09;、矩阵1. 行向量2. 列向量3. 向量其余基本概念4. 矩阵基本概念5. 关于它们的细节 二、运算1. 转置&#xff08;1&#xff09;定义&#xff08;2&#xff09;性质 2. 矩阵&#xff08;向量&#xff0…

算法与数据结构(合并K个升序链表)

思路 有了合并两个链表的基础后&#xff0c;这个的一种方法就是可以进行顺序合并&#xff0c;我们可以先写一个函数用来合并两个链表&#xff0c;再在合并K个链表的的函数中循环调用它。 解题过程 解析这个函数 首先&#xff0c;可以先判断&#xff0c;如果a为空&#xff0c…

Google C++ Style / 谷歌C++开源风格

文章目录 前言1. 头文件1.1 自给自足的头文件1.2 #define 防护符1.3 导入你的依赖1.4 前向声明1.5 内联函数1.6 #include 的路径及顺序 2. 作用域2.1 命名空间2.2 内部链接2.3 非成员函数、静态成员函数和全局函数2.4 局部变量2.5 静态和全局变量2.6 thread_local 变量 3. 类3.…

leetcode_双指针 160.相交链表

160.相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 思路: 本题中&#xff0c;交点不是数值相等&#xff0c;而是指针相等 双指针遍历两遍后必定相遇&#xff0c…

Oracle Primavera P6 最新版 v24.12 更新 2/2

目录 一. 引言 二. P6 EPPM 更新内容 1. 用户管理改进 2. 更轻松地标准化用户设置 3. 摘要栏标签汇总数据字段 4. 将里程碑和剩余最早开始日期拖到甘特图上 5. 轻松访问审计数据 6. 粘贴数据时排除安全代码 7. 改进了状态更新卡片视图中的筛选功能 8. 直接从活动电子…

2024年Web前端最新Java进阶(五十五)-Java Lambda表达式入门_eclipse lambda(1),面试必备

对象篇 模块化编程-自研模块加载器 开源分享&#xff1a;【大厂前端面试题解析核心总结学习笔记真实项目实战最新讲解视频】 Arrays.sort(players, sortByName); // 1.3 也可以采用如下形式: Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2))); ??其…

网络原理(5)—— 数据链路层详解

目录 一. 以太网 1.1 认识以太网 1.2 网卡与以太网 1.3 以太网帧格式 二. 认识MAC地址 三. MAC地址 与 IP地址 的区别 4.1 定义 4.2 分配方式 4.3 工作层次 4.4 地址格式 4.5 寻址方式 四. ARP协议 4.1 引入 4.2 ARP的概念 4.3 ARP工作原理 五. MTU 与 MSS …

DeepSeek R1 模型解读与微调

DeepSeek R1 模型是 DeepSeek 团队推出的一款重要的大语言模型&#xff0c;旨在通过强化学习提升大型语言模型的推理能力。 模型架构 DeepSeek-R1-Zero DeepSeek-R1-Zero 是 DeepSeek 团队推出的第一代推理模型&#xff0c;完全依靠强化学习&#xff08;RL&#xff09;训练&…

proxmox通过更多的方式创建虚拟机

概述 作为一名资深运维工程师&#xff0c;我们经常需要在 Proxmox 虚拟化平台上创建和管理虚拟机。本文将介绍三种不同的方式在 Proxmox 上创建 Ubuntu 虚拟机&#xff1a; 通过 Proxmox 命令创建虚拟机通过 Shell 脚本自动化创建虚拟机使用 Proxmox API 创建虚拟机 每种方式…

Linux 压缩打包

Linux压缩打包 文章目录 Linux压缩打包压缩的意义和原理压缩的意义压缩的原理压缩与解压缩的好处压缩打包命令.zipzip 命令用法unzip 的用法.gzgzip 的用法gunzip 的用法.bz2bzip2 的用法bunzip2 的用法.xzxz 命令用法tar04-Linux压缩打包课后习题压缩的意义和原理 压缩的意义…

Apache HttpClient

HttpClient是apache组织下面的一个用于处理HTTP请求和响应的来源工具&#xff0c;是一个在JDK基础类库是做了更好的封装的类库。 HttpClient 使用了连接池技术来管理 TCP 连接&#xff0c;这有助于提高性能并减少资源消耗。连接池允许 HttpClient 复用已经建立的连接&#xff0…

【C++】STL——list底层实现

目录 &#x1f495;1.list的三个类介绍 &#x1f495;2.list——节点类 &#xff08;ListNode&#xff09; &#x1f495;3.list——链表类 &#xff08;List&#xff09; &#x1f495;4.list——迭代器类&#xff08;重点思考&#xff09;(ListIterator) &#x1f495;5…

SpringUI Web高端动态交互元件库

Axure Web高端动态交互元件库是一个专为Web设计与开发领域设计的高质量资源集合&#xff0c;旨在加速原型设计和开发流程。以下是关于这个元件库的详细介绍&#xff1a; 一、概述 Axure Web高端动态交互元件库是一个集成了多种预制、高质量交互组件的工具集合。这些组件经过精…

02、NodeJS学习笔记,第二节:express与中间件

express与中间件 中文官网&#xff1a;https://www.expressjs.com.cn/nodemon工具 nodemon这个工具&#xff0c;能够监听项目文件的变动。 当代码被修改后&#xff0c;nodemon会帮我们自动重启项目&#xff0c;极大的方便了开发和调试##安装 npm i -g nodemon##使用 之前启动…

通向AGI之路:人工通用智能的技术演进与人类未来

文章目录 引言:当机器开始思考一、AGI的本质定义与技术演进1.1 从专用到通用:智能形态的范式转移1.2 AGI发展路线图二、突破AGI的五大技术路径2.1 神经符号整合(Neuro-Symbolic AI)2.2 世界模型架构(World Models)2.3 具身认知理论(Embodied Cognition)三、AGI安全:价…

结合深度学习、自然语言处理(NLP)与多准则决策的三阶段技术框架,旨在实现从消费者情感分析到个性化决策

针对电商个性化推荐场景的集成机器学习和稳健优化三阶段方案。 第一阶段:在线评论数据处理&#xff0c;利用深度学习和自然语言处理技术进行特征挖掘&#xff0c;进而进行消费者情感分析&#xff0c;得到消费者偏好 在第一阶段&#xff0c;我们主要关注如何通过深度学习和自然语…

哪些专业跟FPGA有关?

FPGA产业作为近几年新兴的技术领域&#xff0c;薪资高、待遇好&#xff0c;吸引了大量的求职者。特别是对于毕业生&#xff0c;FPGA领域的岗位需求供不应求。那么&#xff0c;哪些专业和FPGA相关呢&#xff1f; 哪些专业跟FPGA有关&#xff1f; 微电子学与固体电子学、微电子科…

STM32 LED呼吸灯

接线图&#xff1a; 这里将正极接到PA0引脚上&#xff0c;负极接到GND&#xff0c;这样就高电平点亮LED&#xff0c;低电平熄灭。 占空比越大&#xff0c;LED越亮&#xff0c;占空比越小&#xff0c;LED越暗 PWM初始化配置 输出比较函数介绍&#xff1a; 用这四个函数配置输…

记录一次-Rancher通过UI-Create Custom- RKE2的BUG

一、下游集群 当你的下游集群使用Mysql外部数据库时&#xff0c;会报错&#xff1a; **他会检查ETCD。 但因为用的是Mysql外部数据库&#xff0c;这个就太奇怪了&#xff0c;而且这个检测不过&#xff0c;集群是咩办法被管理的。 二、如果不选择etcd,就选择控制面。 在rke2-…

数据库物理备份:保障数据完整性和业务连续性的关键策略

title: 数据库物理备份:保障数据完整性和业务连续性的关键策略 date: 2025/1/29 updated: 2025/1/29 author: cmdragon excerpt: 在现代企业中,数据被视为最重要的资产之一。因此,确保数据的安全性、完整性和可用性是每个数据库管理员(DBA)的首要任务。在数据管理的过程…