当前位置: 首页 > news >正文

【C#基础】C# 异常处理操作

序号系列文章
6【C#基础】C# 常用语句讲解
7【C#基础】C# 常用数据结构
8【C#基础】C# 面向对象编程

文章目录

  • 前言
  • 1,异常的概念
  • 2,处理异常
  • 3,自定义异常
  • 4,编译器异常
  • 结语

前言

🌷大家好,我是writer桑,前面一章已经学习了 C# 中面向对象编程的知识点,那本章就开始学习 C# 程序中的异常处理操作。为了更好的处理在编程过程中遇到的异常问题,笔者建议大家多实践,不断从实践中总结经验。


1,异常的概念

异常指的是程序运行过程中发生的特殊响应,通常是由外部问题(如硬件、输入错误)所导致的。 在 C# 等面向对象的编程语言中异常也属于对象。 C# 语言的异常处理功能处理在程序运行期间发生的任何意外或异常情况。异常处理提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw。

示例如下:

public class ExceptionTest      // 异常测试 
{static double SafeDivision(double x, double y){if (y == 0)throw new DivideByZeroException();      return x / y;}public static void Main(){//用于测试的输入。更改值以查看//异常处理行为double a = 98, b = 0;double result;try{result = SafeDivision(a, b);Console.WriteLine("{0} 除以 {1} = {2}", a, b, result);}catch (DivideByZeroException){Console.WriteLine("尝试除以0错误。");}}
}

trycatchfinallythrow 关键字的简述:

  • try 关键字声明了一个检查特定的异常的代码块,后跟一个或多个 catch 块。
  • catch 关键字需要和 try 关键字搭配,表示捕获指定的异常类型。
  • finally 关键字声明一个块来表示执行语句,而且不管程序是否抛出错误都会执行。finally 代码块适合用来释放资源。
  • 异常都是使用 throw 关键字创建而成。当需要抛出一个异常时,可以用 throw 关键字。

2,处理异常

在 C# 中,程序运行时的错误通过一种称为"异常"的机制在程序中传播。异常从错误的代码引发,由能够更正错误的代码捕作。C# 提供了内置的 try-catchtry-finallytry-catch-finally 的异常处理语句,可以使用这些语句来完成对异常发生的响应。 未能捕获的异常由系统提供的通用异常处理程序处理,该处理程序会显示一个对话框和错误信息。

示例如下:

// try-catch 语句示例
public class TrycatchTest
{static void ProcessString(string s){if (s == null){throw new ArgumentNullException(paramName: nameof(s), message: "Parameter can't be null");}}public static void Main(){try{string s = null;ProcessString(s);}// 最具体的异常: catch (ArgumentNullException e){Console.WriteLine("{0} First exception caught.", e);}// 至少明确的异常: catch (Exception e){Console.WriteLine("{0} Second exception caught.", e);}}
}/*输出:System.ArgumentNullException: Parameter can't be null (Parameter 's')
*/
  • try-catch 语句包含一个后接一个或多个 catch 子句的 try 块,这些子句指定不同异常的处理程序。
  • catch 块可以指定要捕获的异常的类型,该类型规范称为异常筛选器。注意,不建议用 Exception 作为异常筛选器,除非知道如何处理 try 块中发生的所有异常,或者使用 throw 语句。
  • 异常发生时,公共语言运行时(CLR)查找处理此异常的 catch 语句。如果当前方法不包含此类的 catch 块,则 CLR 会查找类的类,依次类推直到找到匹配的 catch 块。
  • 如果未找到任何 catch 块, 则 CLR 会显示一条未处理的异常信息,并终止程序。
  • 注意 catch 块的顺序,程序在引发异常之后只要找到兼容的 catch 块就会响应。所以尽量按从最具有针对性(或派生程度最高)到最不具有针对性的顺序对 catch 块排列,让程序更高的可读性和方便调试。

// try-finally 语句的示例
public class TryfinallyTest
{public static void Main(){int i = 123;string s = "Some string";object obj = s;try{// 无效的转换; Obj包含字符串,而不是数字类型。i = (int)obj;// 不会运行下面的语句。Console.WriteLine("WriteLine at the end of the try block.");}finally{Console.WriteLine("\nExecution of the finally block after an unhandled\n" +"error depends on how the exception unwind operation is triggered.");Console.WriteLine("i = {0}", i);}}// 输出:// Unhandled exception.System.InvalidCastException:// Unable to cast object of type 'System.String' to type 'System.Int32'. // Execution of the finally block after an unhandled// error depends on how the exception unwind operation is triggered.// i = 123
}
  • finally 常用于关闭打开的资源(如执行文件的关闭操作),或者用于发布资源(如文件流、数据库连接和图形句柄)而无需等待运行时中的垃圾回收器来完成对象。
  • 无论 try 块内的代码是否发生异常或者 catch 块有没有执行,finally 块内的执行语句都会执行。
  • 除非程序意外终止(例如 InvalidProgramException 错误),否则 finally 语句都会执行。 如果希望 finally 块必须执行,则可以加入 catch 块或者捕获堆栈上方的 try 块引发的异常。

// try-catch-finally 语句的示例: 
public class TrycatchfinallyTest
{void ReadFile(int index){// 要运行此代码,请替换本地机器上的有效路径 string path = @"c:\users\public\test.txt";System.IO.StreamReader file = new System.IO.StreamReader(path);char[] buffer = new char[10];try{file.ReadBlock(buffer, index, buffer.Length);}catch (System.IO.IOException e){Console.WriteLine("Error reading from {0}. Message = {1}", path, e.Message);}finally{if (file != null){file.Close();}}}
} 
  • try-catch-finally 语句相当于整合了 try-catch 和 try-finally 语句的功能。
  • catch 和 finally 块常见的用法是获得并使用 try 块中的资源并处理 catch 块中的异常情况,以及释放 finally 块中的资源。

一些补充的内容:

注意在 try 块内初始化的变量,只能在 try 这个代码块内使用。否则在未对变量初始化之前,引用变量会出现异常。例如在下面的代码示例中,变量 n 在 try 块内部初始化,尝试在 WriteLine(n) 语句的 try 块外部使用此变量将生成编译器错误。

示例如下:

using System; public class Program
{static void Main(){int n;try{// 不要在这里初始化这个变量。 n = 123;}catch{}// Error: Use of unassigned local variable 'n'.Console.WriteLine(n);}
}

如果使用 catch 块时想对异常进一步筛选时,可以在 catch 子句的基础上使用 when 关键字加一个布尔表达式来声明。 如果异常筛选器返回 false ,则继续搜索处理程序。

示例如下:

// 表示匹配变量 e 的 ParamName 属性等于字符串 ... 
catch (ArgumentException e) when (e.ParamName == "…")
{// recover from exception
}

3,自定义异常

除了 C# 内置的异常之外,也可以自定义异常,然后用 throw 关键字抛出。用户自定义的异常类派生自 ApplicationException 或 Exception 类。

示例如下:

using System;class TestProgram
{static void Main(string[] args){Program temp = new Program();try{temp.showTemp();}catch (DivideByZeroException e){Console.WriteLine("DivideByZeroException: {0}", e.Message);}Console.ReadKey();}
}public class DivideByZeroException : ApplicationException
{public DivideByZeroException(string? message) : base(message){}
}public class Program
{int number = 0;public void showTemp(){if (number == 0){throw (new DivideByZeroException("Zero Program found"));}else{Console.WriteLine("Program: {0}", number);}}
}

当有以下情况时,开发者应引发异常:

  1. 当方法无法执行自定义的功能时,例如方法的参数是无效的值,但是程序没有处理。
  2. 一个对象执行了不允许的操作,例如对一个只读文件进行写入文本。
  3. 方法成员出现异常,例如说对数组元素的获取超出索引范围。

引发异常时应避免的做法:

  • 使用异常的同时不要在正常执行过程中改变程序的执行流,应使用异常来报告和处理错误条件。
  • 只能用 throw 关键字抛出异常,而不能作为返回值或参数返回异常。
  • 自定义异常应该保证兼容性,不能创建在调式模式抛出,但不会在发布模式下抛出的异常。
  • 请勿有意从自己的源代码中引发 System.Exception、System.SystemException、System.NullReferenceException 或 System.IndexOutOfRangeException。

4,编译器异常

当基础操作失败时,.NET 运行时会自动引发一些异常。下表展示这些异常及其错误条件:

异常错误条件
ArithmeticException算术运算期间出现的异常的基类,例如 DivideByZeroException(除零异常)和OverflowException(溢出异常)。
ArrayTypeMismatchException由于元素的实际类型与数组的实际类型不兼容而导致数组无法存储给定元素时引发。
DivideByZeroException尝试将整数值除以零时引发。
IndexOutOfRangeException索引小于零或超出数组边界时,尝试对数组编制索引时引发。
InvalidCastException从基类型显式转换为接口或派生类型在运行时失败时引发。
NullReferenceException尝试引用值为 null 的对象时引发。
OutOfMemoryException尝试使用新运算符分配内存失败时引发。 此异常表示可用于公共语言运行时的内存已用尽。
OverflowExceptionchecked 上下文中的算术运算溢出时引发。
StackOverflowException执行堆栈由于有过多挂起的方法调用而用尽时引发;通常表示非常深的递归或无限递归。
TypeInitializationException静态构造函数引发异常并且没有兼容的 catch 子句来捕获异常时引发。

结语

🌺 以上就是 C# 异常处理操作的介绍啦,希望能够对大家有所帮助。望大家多多支持,你们的支持就是笔者创作最大的动力!

相关文章:

【C#基础】C# 异常处理操作

序号系列文章6【C#基础】C# 常用语句讲解7【C#基础】C# 常用数据结构8【C#基础】C# 面向对象编程文章目录前言1,异常的概念2,处理异常3,自定义异常4,编译器异常结语前言 🌷大家好,我是writer桑,…...

系统分析师---操作系统思维导图

进程管理(5星) 进程与线程:共享:内存地址空间、代码、数据、文件等不能共享:独立的cpu运行上下文和栈指针、寄存器 信号量与PV操作:信号量,一种特殊的变量分为:信号量可以表示资源数…...

Linux | Ubuntu20.04系统使用命令从移动硬盘/U盘拷贝文件到服务器上

*确认自己移动硬盘、U盘的格式,本文为exfat格式STEP1:把移动硬盘插到Ubuntu系统的主机上查看disk默认位置#查看移动硬盘/U盘在哪个位置命令 fdisk -l #查询后出现了包含电脑系统的所有硬盘查看最后的位置,我的显示为Device, 位置为 /dev/sdb1…...

【经验总结】10年的嵌入式开发老手,到底是如何快速学习和使用RT-Thread的?

【经验总结】一位近10年的嵌入式开发老手,到底是如何快速学习和使用RT-Thread的? RT-Thread绝对可以称得上国内优秀且排名靠前的操作系统,在嵌入式IoT领域一直享有盛名。近些年,物联网产业的大热,更是直接将RT-Thread这…...

一起Talk Android吧(第五百零九回:约束布局中的组功能一)

文章目录功能介绍使用方法GroupLayer对比总结各位看官们大家好,上一回中咱们说的例子是"多层布局功能",这一回中咱们说的例子是"约束布局中的组功能"。闲话休提,言归正转, 让我们一起Talk Android吧! 功能介…...

2023安徽省“中银杯”职业技能大赛“网络安全” 项目比赛任务书

2023安徽省“中银杯”职业技能大赛“网络安全” 项目比赛任务书2023安徽省“中银杯”职业技能大赛“网络安全” 项目比赛任务书A模块基础设施设置/安全加固(200分)A-1:登录安全加固(Windows, Linux)A-2:Ngi…...

观测云产品更新|新增用户访问监测自动化追踪;新增 CDN 质量分析;新增自定义查看器导航菜单等

观测云更新 用户访问监测优化 新增用户访问监测自动化追踪 用户访问监测新增自动化追踪,通过“浏览器插件”的实现方式,使用浏览器记录用户访问行为,创建无代码的端到端测试。更多详情可参考文档【 自动化追踪 】https://docs.guance.com/…...

大数据技术生态全景一览

大数据技术生态全景一览大数据平台ETL数据接入大数据平台海量数据存储大数据平台通用计算大数据平台各场景的分析运算分布式协调服务任务流调度引擎大数据平台ETL数据接入 大数据有很多的产品,琳琅满目。从架构图上就能看出产品很多。这些产品它们各自的功能是什么…...

CI/CD | 深入研究Jenkins后,我挖掘出了找到了摆脱低效率低下的方法

在本系列的第一篇文章中,您已经了解了一些关于如何管理Jenkins的内容,主要是为无序的人带来秩序。在这篇文章中,我将更深入地探讨我效率低下的问题,提出我们工作流中一些安全性、治理和合规性的挑战。这不仅仅是你在网站上或展览横…...

刷LeetCode

文章目录滑动窗口算法1 涉及知识点 :unordered_set 容器2 参数详情3 例题滑动窗口算法 滑动的窗口,每次记录下窗口的状态,再找出符合条件的窗口使用滑动窗口减少时间复杂度 1 涉及知识点 :unordered_set 容器 说明:…...

Spring 大白话系列:工厂

Spring 大白话系列:工厂 “工厂模式,大家都很熟悉了。说到底,就是解除创建对象和使用对象之间的耦合。这东西没啥啊。” 教室里,老师傅听到小明在嘀嘀咕咕的。老师走过去问: “有什么问题呢小明同学?” 小…...

喜讯!华秋电子荣获第六届“蓝点奖”十佳分销商奖

2 月 25 日,由深圳市电子商会主办的2023 中国电子信息产业创新发展交流大会暨第六届蓝点奖颁奖盛典在深圳隆重举行。 图:华秋商城渠道总监杨阳(右三) 深圳市电子商会连续六年举办“蓝点奖”评选活动,旨在表彰对电子信…...

Linux概述

1:Linux概述1.1:操作系统常见操作系统有:Windows、MacOS、Linux。名称描述Windows微软公司研发的收费操作系统。分为两类:用户操作系统、Server操作系统。用户操作系统:win 95、win 98、win NT、win Me、win xp、vista…...

中级嵌入式系统设计师2015下半年上午试题及答案解析

中级嵌入式系统设计师2015下半年上午试题 单项选择题 1、CPU是在______结束时响应DMA请求的。 A.一条指令执行 B.一段程序 C.一个时钟周期 D.一个总线周期 2、虚拟存储体系由______两级存储器构成。 A.主存-辅存 B.寄存器-Cache C.寄存器-主存...

华为OD机试模拟题 用 C++ 实现 - 删除指定目录(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明删除指定目录题目输入输出示例一输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为…...

【正点原子FPGA连载】第二十章AXI4接口之DDR读写实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第二十章AXI4接口…...

超出认知的数据压缩 用1-bit数据来表示32-bit的梯度 语音识别分布式机器学习 梯度压缩 论文精读

说明 介绍1−bit1-bit1−bit论文内容。 原文链接:1-bit stochastic gradient descent and its application to data-parallel distributed training of speech DNNs | Semantic Scholar ABS 实验证明在分布式机器学习的过程中能够通过将同步所传递的梯度进行量化…...

深度剖析指针(上)——“C”

各位CSDN的uu们你们好呀,今天,小雅兰的内容是指针噢,在学习C语言的过程中,指针算是一个比较重要的内容,当然,难度也是比较大的,那么现在就让小雅兰来带大家进入指针的世界吧 字符指针 数组指针…...

学习 Python 之 Pygame 开发魂斗罗(六)

学习 Python 之 Pygame 开发魂斗罗(六)继续编写魂斗罗1. 创建碰撞类2. 给地图添加碰撞体3. 让人物可以掉下去4. 实现人物向下跳跃5. 完整的代码继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗(五)中,我…...

LeetCode题解:1238. 循环码排列,归纳法,详细注释

原题链接: https://leetcode.cn/problems/circular-permutation-in-binary-representation/ 前置条件: 在解题之前,请先一定要阅读89.格雷编码的题解格雷编码可以满足题目的条件“p[i] 和 p[i1] 的二进制表示形式只有一位不同”&#xff0c…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

【JavaEE】-- HTTP

1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

如何为服务器生成TLS证书

TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...