【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错误。");}}
}
try、catch、finally 和 throw 关键字的简述:
- try 关键字声明了一个检查特定的异常的代码块,后跟一个或多个 catch 块。
- catch 关键字需要和 try 关键字搭配,表示捕获指定的异常类型。
- finally 关键字声明一个块来表示执行语句,而且不管程序是否抛出错误都会执行。finally 代码块适合用来释放资源。
- 异常都是使用 throw 关键字创建而成。当需要抛出一个异常时,可以用 throw 关键字。
2,处理异常
在 C# 中,程序运行时的错误通过一种称为"异常"的机制在程序中传播。异常从错误的代码引发,由能够更正错误的代码捕作。C# 提供了内置的 try-catch、try-finally 和 try-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);}}
}
当有以下情况时,开发者应引发异常:
- 当方法无法执行自定义的功能时,例如方法的参数是无效的值,但是程序没有处理。
- 一个对象执行了不允许的操作,例如对一个只读文件进行写入文本。
- 方法成员出现异常,例如说对数组元素的获取超出索引范围。
引发异常时应避免的做法:
- 使用异常的同时不要在正常执行过程中改变程序的执行流,应使用异常来报告和处理错误条件。
- 只能用 throw 关键字抛出异常,而不能作为返回值或参数返回异常。
- 自定义异常应该保证兼容性,不能创建在调式模式抛出,但不会在发布模式下抛出的异常。
- 请勿有意从自己的源代码中引发 System.Exception、System.SystemException、System.NullReferenceException 或 System.IndexOutOfRangeException。
4,编译器异常
当基础操作失败时,.NET 运行时会自动引发一些异常。下表展示这些异常及其错误条件:
异常 | 错误条件 |
---|---|
ArithmeticException | 算术运算期间出现的异常的基类,例如 DivideByZeroException(除零异常)和OverflowException(溢出异常)。 |
ArrayTypeMismatchException | 由于元素的实际类型与数组的实际类型不兼容而导致数组无法存储给定元素时引发。 |
DivideByZeroException | 尝试将整数值除以零时引发。 |
IndexOutOfRangeException | 索引小于零或超出数组边界时,尝试对数组编制索引时引发。 |
InvalidCastException | 从基类型显式转换为接口或派生类型在运行时失败时引发。 |
NullReferenceException | 尝试引用值为 null 的对象时引发。 |
OutOfMemoryException | 尝试使用新运算符分配内存失败时引发。 此异常表示可用于公共语言运行时的内存已用尽。 |
OverflowException | checked 上下文中的算术运算溢出时引发。 |
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] 的二进制表示形式只有一位不同”,…...
全新后门文件Nev-3.exe分析
一、 样本发现: 蜜罐 二、 内容简介: 通过公司的蜜罐告警发现一个Nev-3.exe可执行文件文件,对该样本文件进行分析发现,该可执行程序执行后会从远程服务器http://194.146.84.2:4395/下载一个名为“3”的压缩包,解压后…...
线性回归系数解释
线性回归系数解释线性回归系数1、R2R^2R2(R方,R-Square)2、Adj−R2Adj-R^2Adj−R2(调整后的 R 方)3、标准误差4、FFF 值5、FFF 显著度6、置信区间7、PPP 值线性回归系数 回归模型得到后会有多个系数,这些系…...
22.2.27打卡 Codeforces Round #852 (Div. 2) A~D
A Yet Another Promotion 题面翻译 题目描述 共 ttt 组数据,每组数据中,你需要买 nnn 公斤苹果,第一天单价为 aaa ,但每买 mmm 公斤赠送一公斤;第二天单价为 bbb 。求最小花费。 输入输出格式 第一行一个正整数 …...
如何查看Spring Boot各版本的变化
目录 1.版本 2.基础特性和使用 3.新增特性和Bug修复 1.版本 打开Spring官网,点进Spring Boot项目我们会发现在不同版本后面会跟着不同的标签: 这些标签对应不同的版本,其意思如下: GA正式版本,通常意味着该版本已…...
程序员是否要加入创业公司?
我从1月份入职到2月份离职,历时一个半月。短暂的体验了一段创业生活,更准确的说是一段“待在”创业团队的生活,因为我发现创业本身跟我关系不大。一个半月的就业经历,对任何人来说都不是一个好选择,当然也不是我所期望…...
2023软件测试工程师全新技术栈,吃透这些,起薪就是25k~
相信每个准备软件测试面试的同学,不管你是大学刚毕业,满心憧憬着进入公司实习、非计算机行业转行软件测试、自学测试就业还是培训后就业,都会面临着众多的疑问和不解,那就是该怎么走出着第一步,今天本文一次性告诉你&a…...
【ChatGPT情商大考验】ChatGPT教我谈恋爱
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...
C++类内存结构模型
内存分区 内存全局数据区,代码区,栈区,堆区。 定义一个类 类的成员函数被放在代码区 类的静态成员变量被放在全局数据区(不占用类的存储空间) 非静态成员在类的实例内,实例在栈区或者堆区 虚函数指针&…...
HTML#4超链接标签,列表标签,表格标签和布局标签
一. 超链接标签介绍<a> 定义超链接,用于连接到另一个资源herf: 指定访问资源的URLtarget: 指定打开资源的方式代码<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>超链接标签</title> <…...
本科课程【数字图像处理】实验汇总
文章目录 实验1 - 腐蚀与膨胀实验2 - 图像增强实验3 - 图像的几何变换实验4 - 图像的蒙纱效果实验5 - 空洞填充实验6 - 取阈值的邻域平均算法实验7 - 图像的平移与伸缩变换实验1 - 腐蚀与膨胀 实验目的 分析掌握腐蚀与膨胀的基本原理,编写腐蚀与膨胀的算法,并掌握开闭运算的规…...
自己给公司做网站/上海专业排名优化公司
在日常工作中,批量管理服务器是个力气活,如果人工一台一台处理,效率低下。此时,老外写的pssh工具实现了批量管理。http://www.theether.org/pssh/ 它的原理是先建立ssh私钥认证,然后用pssh工具批量管理。 下面…...
浏阳做网站推荐/外链推广论坛
本站使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)本文作者: 苏洋创建时间: 2018年07月19日统计字数: 2595字阅读时间: 6分钟阅读原始链接: https://soulteary.com/2018/07/19/clean…...
简约大气风格网站模板/百度账号怎么改名字
一、问题描述 发生在生产环境的真实案件,加了一张分表之后,导致系统挂掉,此外,分表还未有任何数据记录。分表配置与其他相同分表的配置相同。 二、排查过程 1.刚开始系统挂掉时,以为是系统问题,因此重启系统…...
银川网站建设价格/百度推广关键词和创意
1. 支持手机、pad等移动设备远程控制功能。2、支持DLNA、Airplay、QPaly等协议。3、Cortex-A9四核,7寸电容触摸屏,1024*600高清分辨屏,标配通用的网络接口,内置wifi无线连接。4、功率:35W*45、4声道输出,支…...
网站建设的发展目标/营销推广方案
声明第三方字体 font-face {font-family: myFirstFont;src: url(Sansation_Light.ttf),url(Sansation_Light.eot); /* IE9 */ } 使用font-face指定字体的名称和资源地址。 使用第三方字体 示例 <div> 使用 CSS3,网站终于可以使用字体以外的预先选择“合法”字体 <…...
网架公司名字大全/网络优化的工作内容
初中数学常见的一次函数,画起来还是相当方便的,在word中可以直接用直线工具及箭头工具,就可以搞定了。但是对于二次函数、反比例函数、三次函数、三角函数等曲线图形,要精确画出这些函数,word的图形功能就无能为力了。…...