掌握 C# 异常处理机制
在任何编程语言中,处理错误和异常都是不可避免的。C# 提供了强大的异常处理机制,可以帮助开发者优雅地捕获和处理程序中的异常,确保程序的健壮性和可靠性。本文将带你了解 C# 中的异常类、try-catch 语句、自定义异常以及 finally 块的使用。
1. 异常类与结构
在 C# 中,所有异常都是从 System.Exception 类派生的。Exception 类是所有异常类的基类,它提供了丰富的属性来描述异常的详细信息。
常见的异常类有:
System.NullReferenceException:当引用对象为null时引发的异常。System.IndexOutOfRangeException:当数组索引超出范围时引发的异常。System.DivideByZeroException:当尝试用零除数时引发的异常。
每个异常类都提供以下常见属性:
- Message:异常的描述信息。
- StackTrace:异常发生时的调用堆栈信息。
- InnerException:嵌套的异常信息。
try
{int[] array = new int[2];Console.WriteLine(array[5]); // 引发 IndexOutOfRangeException
}
catch (Exception ex)
{Console.WriteLine($"Error: {ex.Message}");Console.WriteLine($"StackTrace: {ex.StackTrace}");
}
2. try-catch 语句
try-catch 语句 是处理异常的核心结构。try 块用于放置可能引发异常的代码,catch 块则捕获并处理异常。
try
{int result = 10 / 0; // 引发 DivideByZeroException
}
catch (DivideByZeroException ex)
{Console.WriteLine("Attempted to divide by zero.");
}
在上面的代码中,try 块中的代码尝试将 10 除以 0,从而引发 DivideByZeroException。catch 块捕获到该异常并输出一条错误信息。
你可以在 catch 语句中捕获特定的异常类型,也可以捕获通用的 Exception 异常。
try
{string text = null;Console.WriteLine(text.Length); // 引发 NullReferenceException
}
catch (NullReferenceException ex)
{Console.WriteLine("Null reference encountered.");
}
catch (Exception ex)
{Console.WriteLine($"General exception: {ex.Message}");
}
3. 自定义异常
C# 允许开发者根据具体需求创建自定义异常类。自定义异常通常派生自 Exception 类,并添加额外的属性或方法来提供更详细的错误信息。
public class InvalidAgeException : Exception
{public InvalidAgeException(string message) : base(message) { }
}public class Person
{public int Age { get; set; }public void SetAge(int age){if (age < 0 || age > 150)throw new InvalidAgeException("Age must be between 0 and 150.");Age = age;}
}try
{Person person = new Person();person.SetAge(-5); // 引发自定义异常
}
catch (InvalidAgeException ex)
{Console.WriteLine(ex.Message); // 输出:Age must be between 0 and 150.
}
在这个示例中,InvalidAgeException 是一个自定义异常类,用于处理年龄设置不合法的情况。
4. finally 块的使用
finally 块 用于执行无论是否发生异常都必须执行的代码。常见的用法是释放资源、关闭文件流或数据库连接等。
FileStream fs = null;
try
{fs = new FileStream("example.txt", FileMode.Open);// 读取文件操作
}
catch (FileNotFoundException ex)
{Console.WriteLine("File not found.");
}
finally
{if (fs != null){fs.Close();Console.WriteLine("FileStream closed.");}
}
无论是否发生异常,finally 块中的代码都会执行。它常用于确保资源正确释放,避免资源泄漏。
结论
异常处理是编写健壮程序的关键。C# 提供了强大的异常处理机制,通过 try-catch 语句捕获并处理异常,自定义异常类来满足特定需求,finally 块确保资源得到正确释放。掌握这些工具可以帮助你更好地编写安全且可维护的代码。
以下是本文的总结:
- 使用
try-catch捕获并处理异常。 - 使用
Exception类的属性获取异常详细信息。 - 创建自定义异常类来处理特定的业务需求。
- 使用
finally块保证资源被正确释放。
通过理解和应用这些异常处理机制,你可以显著提高代码的健壮性,确保程序在意外错误发生时仍然能优雅地运行。
这篇博客涵盖了 C# 中的异常处理基础。如果你对某个特定主题有疑问或需要更多信息,欢迎留言或联系我!
相关文章:
掌握 C# 异常处理机制
在任何编程语言中,处理错误和异常都是不可避免的。C# 提供了强大的异常处理机制,可以帮助开发者优雅地捕获和处理程序中的异常,确保程序的健壮性和可靠性。本文将带你了解 C# 中的异常类、try-catch 语句、自定义异常以及 finally 块的使用。…...
【Redis】Redis Cluster 简单介绍
Redis Cluster 是 Redis 3.0 提供的一种分布式解决方案, 允许数据在多个节点之间分散存储, 从而实现高可用性和可扩展性。 特点: 分片: Redis Cluster 将数据分散到多个节点, 通过哈希槽 (hash slots) 机制将键映射到不同的节点上。总共有 16384 个哈希槽, 每个节点负责一部分…...
【EXCEL数据处理】000010 案列 EXCEL文本型和常规型转换。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。
前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】000010 案列 EXCEL单元格格式。EXCEL文本型和常规型转…...
golang grpc进阶
protobuf 官方文档 基本数据类型 .proto TypeNotesGo Typedoublefloat64floatfloat32int32使用变长编码,对于负值的效率很低,如果你的域有可能有负值,请使用sint64替代int32uint32使用变长编码uint32uint64使用变长编码uint64sint32使用变长…...
Java JUC(三) AQS与同步工具详解
Java JUC(三) AQS与同步工具详解 一. ReentrantLock 概述 ReentrantLock 是 java.util.concurrent.locks 包下的一个同步工具类,它实现了 Lock 接口,提供了一种相比synchronized关键字更灵活的锁机制。ReentrantLock 是一种独占…...
使用rust写一个Web服务器——async-std版本
文章目录 实现异步代码并发地处理连接使用多线程提升性能 使用rust实现一个异步运行时是async-std的单线程Web服务器。 仓库地址: 1037827920/web-server: 使用rust编写的简单web服务器 (github.com) 在之前的单线程版本的Web服务器代码上进行修改,具体…...
C语言复习概要(一)
本文 C语言入门详解:从基础概念到分支与循环1. C语言常见概念1.1 程序的基本结构1.2 变量作用域和存储类1.3 输入输出1.4 编译与运行 2. C语言中的数据类型和变量2.1 基本数据类型2.2 变量的声明与初始化2.3 常量与枚举 3. C语言的分支结构3.1 if语句3.2 if-else语句…...
二、kafka生产与消费全流程
一、使用java代码生产、消费消息 1、生产者 package com.allwe.client.simple;import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.pr…...
本地搭建OnlyOffice在线文档编辑器结合内网穿透实现远程协作
文章目录 前言1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 前言 本篇文章讲解如何使用Docker在本地Linux服务器上安装ONLYOFFICE,并结合cpolar内网穿透实现公网访问本地部署的文档编辑器与远程协作。 Community Editi…...
ScrapeGraphAI 大模型增强的网络爬虫
在数据驱动的动态领域,从在线资源中提取有价值的见解至关重要。从市场分析到学术研究,对特定数据的需求推动了对强大的网络抓取工具的需求。 NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线…...
PDF转换为TIF,JPG的一个简易工具(含下载链接)
目录 0.前言: 1.工具目录 2.工具功能(效果),如何运行 效果 PDF转换为JPG(带颜色) PDF转换为TIF(LZW形式压缩,可以显示子的深浅) PDF转换为TIF(CCITT形…...
Wireshark 解析QQ、微信的通信协议|TCP|UDP
写在前面 QQ,微信这样的聊天软件。我们一般称为im,Instant Messaging,即时通讯系统。那大家会不会有疑问,自己聊天内容会不会被黑客或者不法分子知道?这种体量的im是基于tcp还是udp呢?这篇文章我们就来探索…...
网络编程(5)——模拟伪闭包实现连接的安全回收
六、day6 今天学习如何利用C11模拟伪闭包实现连接的安全回收,之前的异步服务器为echo模式,但存在安全隐患,在极端情况下客户端关闭可能会导致触发写和读回调函数,二者都进入错误处理逻辑,进而造成二次析构。今天学习如…...
C#绘制动态曲线
前言 用于实时显示数据动态曲线,比如:SOC。 //用于绘制动态曲线,可置于定时函数中,定时更新数据曲线 void DrawSocGraph() {double f (double)MainForm.readData[12]; //display datachart1.Series[0].Points.Add(f);if (ch…...
用Python实现运筹学——Day 10: 线性规划的计算机求解
一、学习内容 1. 使用 Python 的 scipy.optimize.linprog 进行线性规划求解 scipy.optimize.linprog 是 Python 中用于求解线性规划问题的函数。它实现了单纯形法、内点法等算法,能够处理求解最大化或最小化问题,同时满足线性约束条件。 线性规划问题的…...
[C++]使用C++部署yolov11目标检测的tensorrt模型支持图片视频推理windows测试通过
官方框架: https://github.com/ultralytics/ultralytics yolov8官方最近推出yolov11框架,标志着目标检测又多了一个检测利器,于是尝试在windows下部署yolov11的tensorrt模型,并最终成功。 重要说明:安装环境视为最基…...
霍夫曼树及其与B树和决策树的异同
霍夫曼树是一种用于数据压缩的二叉树结构,通常应用于霍夫曼编码算法中。它的主要作用是通过对符号进行高效编码,减少数据的存储空间。霍夫曼树在压缩领域扮演着重要角色,与B树、决策树等数据结构都有一些相似之处,但又在应用场景和…...
CompletableFuture常用方法
一、获得结果和触发计算 1.获取结果 (1)public T get() public class CompletableFutureAPIDemo{public static void main(String[] args) throws ExecutionException, InterruptedException{CompletableFuture<String> completableFuture Com…...
本地化测试对游戏漏洞修复的影响
本地化测试在游戏开发的质量保证过程中起着至关重要的作用,尤其是在修复bug方面。当游戏为全球市场做准备时,它们通常会被翻译和改编成各种语言和文化背景。这种本地化带来了新的挑战,例如潜在的语言错误、文化误解,甚至是不同地区…...
使用rust实现rtsp码流截图
中文互联网上的rust示例程序源码还是太稀少,找资料很是麻烦,下面是自己用业余时间开发实现的一个对批量rtsp码流源进行关键帧截图并存盘的rust demo源码记录。 要编译这个源码需要先安装vcpkg,然后用vcpkg install ffmpeg安装最新版本的ffmpe…...
Nucleus MCP:构建AI智能体标准化工具层的核心架构与实践
1. 项目概述:一个为AI智能体打造的“工具箱”中枢最近在折腾AI智能体(Agent)开发的朋友,可能都遇到过类似的困境:你有一个绝佳的想法,想让AI去调用某个API、查询数据库,或者操作一个本地工具。你…...
Cortex-R52性能监控与调试架构深度解析
1. Cortex-R52性能监控单元架构解析在嵌入式实时系统中,性能监控单元(PMU)如同汽车的仪表盘,为开发者提供处理器内部运行状态的实时数据。Cortex-R52的PMU模块采用三级监控架构:1.1 事件采集层处理器内部部署了45个专用硬件计数器,…...
ARMv8/v9异常处理与ESR寄存器深度解析
1. ARM异常处理机制概述异常处理是现代处理器架构的核心功能之一,它使系统能够响应硬件故障、软件错误和外部事件。在ARMv8/v9架构中,异常处理机制经过精心设计,为不同特权级别(EL0-EL3)提供了细粒度的控制能力。当处理…...
从Landsat 8数据到地表温度:劈窗算法实战解析
1. 从Landsat 8数据到地表温度:劈窗算法实战解析 地表温度是研究城市热岛效应、农业干旱监测、气候变化等领域的重要参数。Landsat 8卫星搭载的热红外传感器TIRS(Thermal Infrared Sensor)提供了两个热红外波段(B10和B11ÿ…...
2026浏览器插件指纹溯源机制与插件环境安全优化实战指南
一、前言:插件特征成为批量虚拟环境识别的新型突破口在矩阵运营行业精细化风控对抗背景下,UA 修改、IP 切换、基础指纹伪装已经成为行业标配操作,平台逐渐放弃基础参数检测,转向高隐蔽、高区分度、极易被忽略的插件指纹进行设备识…...
嵌入式软件测试的范式革命——技术体系与工程价值深度解析
第一章 引言:嵌入式软件质量危机的时代背景在汽车电子、航空航天、工业控制、医疗设备等安全关键领域,嵌入式软件的复杂度正以指数级速度增长。一辆高端智能电动汽车的代码量已突破两亿行,超越了波音787客机的软件规模。与此同时,…...
ComfyUI-FramePackWrapper终极指南:8GB显存玩转高质量AI视频生成
ComfyUI-FramePackWrapper终极指南:8GB显存玩转高质量AI视频生成 【免费下载链接】ComfyUI-FramePackWrapper 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-FramePackWrapper 想要在有限硬件条件下实现专业级AI视频生成吗?ComfyUI-Fram…...
蓝牙窃密攻防实战:从协议漏洞到固件后门,国家安全部警示的近场威胁全解析
2026年5月11日,国家安全部官方发布重磅警示,明确指出蓝牙设备已成为不法分子实施近距离窃密、监听、跟踪的"隐形獠牙"。从日常使用的无线耳机、智能手表,到办公场景的蓝牙键鼠、会议音箱,再到工业控制中的蓝牙传感器&am…...
避坑指南:ESP32-C3蓝牙通信中ESP_GATTS_READ_EVT事件的正确理解与数据更新时机
ESP32-C3蓝牙GATT通信中的数据更新陷阱与实战解决方案 当你在ESP32-C3上实现蓝牙GATT通信时,是否遇到过这样的困惑:明明在ESP_GATTS_READ_EVT事件中更新了特征值,但客户端读取到的却总是旧数据?这个看似简单的现象背后,…...
别再折腾Bootloader了!STM32H7内部Flash+QSPI Flash混合运行实战(MDK配置详解)
STM32H7混合存储架构开发实战:告别Bootloader的繁琐时代 在嵌入式开发领域,STM32H7系列凭借其高性能Cortex-M7内核和丰富的外设资源,已成为工业控制、智能设备和图形界面应用的宠儿。然而,传统开发模式中Bootloader与应用程序分离…...
