C#学习笔记 - C#基础知识 - C#从入门到放弃 - C# 处理程序异常相关技术
C# 入门基础知识 - C# 处理程序异常相关技术
- 第11节 处理程序异常相关技术
- 11.1 捕获异常
- 11.2 清除、处理所有异常
- 11.3 引发异常
- 11.4 预定义异常类
- 11.5 自定义异常类
- 11.6 异常的综合运用
更多C#基础知识点可查看:C#学习笔记 - C#基础知识 - C#从入门到放弃
第11节 处理程序异常相关技术
三种异常处理语句:
① try...catch
//捕获异常
② try...finally
//清除异常
③ try...catch...finally
//处理所有异常
11.1 捕获异常
try…catch语句:
try...catch
语句是最常见的异常处理技术。它允许我们在可能引发异常的代码块中捕获和处理异常。try
块用于放置可能引发异常的代码,而catch
块用于捕获和处理特定类型的异常。
语法示例:
try
{// 可能引发异常的代码// ...
}
catch (ExceptionType1 ex)
{// 处理异常类型1
}
catch (ExceptionType2 ex)
{// 处理异常类型2
}
【代码示例】
//利用try...catch语句来捕获数组的越界问题int[] intArray = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };try{for (int i = 0; i <= intArray.Length; i++)Console.Write(intArray[i] + " ");}catch(Exception myex){Console.WriteLine("\n程序出现异常:"+myex.Message);//Console.WriteLine(myex.Message.ToString());}Console.ReadKey();
运行程序:
0 2 4 6 8 10 12 14 16 18 20
程序出现异常:索引超出了数组界限。
11.2 清除、处理所有异常
finally块:
finally
块用于指定无论是否发生异常,都要执行的清理代码。无论是否发生异常,finally
块中的代码都会被执行。通常情况下,在finally
块中进行释放占用资源或确保某些操作完成的操作。
语法示例:
try
{// 可能引发异常的代码
}
finally
{// 清理代码
}
此语法可以处理异常,但是无法看见任何异常信息,所以可以结合catch
语句,组合成以下语法:
try
{// 可能引发异常的代码
}
catch (Exception ex)
{// 处理异常
}
finally
{// 清理代码
}
【代码示例】
int[] intArray = { 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };try{for (int i = 0; i < intArray.Length; i++){int temp = 720 / intArray[i];Console.WriteLine("720÷{0}={1}", intArray[i], temp);}}catch(Exception myex){Console.WriteLine(myex.Message);}finally{Console.WriteLine("无论是否发生异常,此finally语句块中代码都会被执行。");}Console.ReadKey();
运行程序:
尝试除以零。
无论是否发生异常,此finally语句块中代码都会被执行。
11.3 引发异常
throw语句:
throw
语句用于手动引发异常。可以使用throw
语句在代码中显式引发异常对于创建自定义异常或重新引发现有异常时非常有用。
【示例】
定义一个将字符串转换为整数的私有静态方法ConvertStringToInt;它含有一个字符串类型参数,返回一个整数,然后使用方法将一个不能转换成整数的字符串转换成整数,从而引发异常
private static int ConvertStringToInt(String mystr)
class Program{private static int ConvertStringToInt(string mystr){int outnum = 0;try{outnum = Convert.ToInt32(mystr);return outnum;}catch{throw new FormatException("Eorr:格式转换 不正确");}}static void Main(string[] args){//string mystr = "123"; //123string mystr = "hao123"; //Eorr:格式转换 不正确try{int myint;myint = Program.ConvertStringToInt(mystr);Console.WriteLine(myint);}catch(FormatException exf){Console.WriteLine(exf.Message);}Console.ReadKey();}}
11.4 预定义异常类
在C#中,有许多预定义的异常类,它们分别用于表示不同类型的异常情况。以下是一些常见的预定义异常类的简要介绍:
异常类 | 说明 |
---|---|
Exception | Exception是所有异常类的基类,它表示通用的异常情况。一般情况下,我们不直接使用Exception类,而是使用它的子类。 |
SystemException | SystemException是Exception的子类,它代表由.NET框架或CLR引发的异常。例如,NullReferenceException和DivideByZeroException都是SystemException的子类。 |
ApplicationException | ApplicationException是Exception的子类,它代表由应用程序代码引发的异常。通常,我们可以通过自定义的方式来创建派生自ApplicationException的自定义异常类。 |
ArgumentException | ArgumentException代表参数异常,表示一个或多个方法参数不符合预期。它有一些常见的子类,如ArgumentNullException(参数为null),ArgumentOutOfRangeException(参数超出有效范围)等。 |
InvalidOperationException | InvalidOperationException表示在对象的当前状态下,操作是无效的或不合理的异常。这个异常通常在对象的状态不允许执行某个操作时引发。 |
IndexOutOfRangeException | IndexOutOfRangeException表示索引超出范围的异常,通常在数组或集合访问时发生。 |
NullReferenceException | NullReferenceException表示空引用异常,当尝试通过对null引用进行成员访问、方法调用或属性访问时,会引发此异常。 |
DivideByZeroException | DivideByZeroException表示除以零的异常,当对一个数字类型进行除法运算时,除数为零时会引发此异常。 |
【部分异常类示例】
1、ArgumentException
static int DivideByTwo(int num){if (num % 2 == 1)throw new ArgumentException("此处必须为偶数", "num");return num / 2;}static void Main(string[] args){//ArgumentException异常try{Console.WriteLine(DivideByTwo(9));}catch(ArgumentException exa1){//Console.WriteLine("9不能被2整除");Console.WriteLine(exa1.Message);}Console.ReadKey();}
运行结果:
此处必须为偶数
参数名: num
2、InvalidCastException
//2、InvalidCastException 异常bool myBool = true;try{char myChar = Convert.ToChar(myBool);}catch(InvalidCastException exi){Console.WriteLine(exi.Message);}
运行程序:
从“Boolean”到“Char”的强制转换无效。
3、ArrayTypeMismatchException
//ArrayTypeMismatchException 异常string[] myStr = { "Cat", "Dog", "Pig", "Dock" };object[] myObj = myStr;try{foreach (object outobj in myObj){Console.Write(outobj + " ");Console.WriteLine(outobj.GetType());myObj[1] = 13;}}catch (ArrayTypeMismatchException exa2){Console.WriteLine(exa2.Message);}
运行程序:
Cat System.String
尝试访问类型与数组不兼容的元素。
4、OverflowException
//OverflowException try{byte myByte = Convert.ToByte(Console.ReadLine());Console.WriteLine(myByte);}catch(OverflowException exo){Console.WriteLine(exo.Message);}
运行程序:
//输入范围内数值
123
123//输入超出范围数值
266
值对于无符号的字节太大或太小。
11.5 自定义异常类
在C#中,可以通过继承预定义的异常类来创建自定义异常类,以表示特定的异常情况。自定义异常类可以提供更多的信息和上下文,以便更好地定位和处理异常。
1、继承预定义的异常类:
要创建自定义异常类,首先要选择一个适合的预定义异常类作为基类。通常,如果可以找到与自定义异常类型相关的现有预定义异常类,那么最好继承那个异常类。基于自定义异常的性质和用途,可以选择继承的异常类,如Exception
、ApplicationException
等。
2、添加构造函数:
在自定义异常类中,我们应该添加合适的构造函数来初始化异常对象。构造函数可以接受参数以提供额外的信息,例如错误消息、内部异常和其他上下文数据。通常,自定义异常类的构造函数应该调用基类的构造函数,以便为基类异常提供必要的信息。
3、添加额外的属性和方法:
除了继承自基类的属性和方法之外,我们也可以为自定义异常类添加自己的属性和方法,用于提供更多的异常信息或定制化的异常处理逻辑。这些额外的属性和方法可以根据具体需求来设计。
【自定义异常类示例】
1、只定义自定义异常类
class MyException : Exception{}class Program{static void Main(string[] args){try{Console.WriteLine("此语句在引发异常前输出。");throw new MyException();Console.WriteLine("由于引发了异常,此语句不会被输出。");}catch(MyException exm){Console.WriteLine(exm.Message); Console.WriteLine("自定义异常(由程饱饱定义):输出此语句说明引发异常。");}Console.ReadKey();}}
运行程序:
此语句在引发异常前输出。
引发类型为“自定义异常类.MyException”的异常。
自定义异常(由程饱饱定义):输出此语句说明引发异常。
2、在内中定义方法
class MyException : Exception{public MyException(string message):base(message){}}class Program{static void Main(string[] args){try{Console.WriteLine("此语句在引发异常前输出。");string myStr = "自定义异常(由程饱饱定义):输出此语句说明引发异常。";throw new MyException(myStr);Console.WriteLine("由于引发了异常,此语句不会被输出。");}catch(MyException exm){Console.WriteLine(exm.Message);//Console.WriteLine("自定义异常(由程饱饱定义):输出此语句说明引发异常。");}Console.ReadKey();}}
运行程序:
此语句在引发异常前输出。
引发类型为“自定义异常类.MyException”的异常。
自定义异常(由程饱饱定义):输出此语句说明引发异常。
11.6 异常的综合运用
1、输入一个数(int),求该数的倒数
2、根据用户输入的内容的不同产生相应异常提示:
① 除零异常 - 0
② 溢出异常 - 2^32
③ 转换异常 - string->int
④ 其他未知异常
【示例】
static void Main(string[] args){Console.WriteLine("请输入一个整数:");try{int myInt = int.Parse(Console.ReadLine());double myDouble = 1.0 / myInt;Console.WriteLine("该数的倒数是:"+myDouble);}catch(DivideByZeroException){Console.WriteLine("产生除零异常");}catch (OverflowException){Console.WriteLine("产生溢出异常");}catch (FormatException){Console.WriteLine("产生转换异常");}catch (Exception){Console.WriteLine("产生其他异常");}Console.ReadKey();}
运行结果:
请输入一个整数:
0
该数的倒数是:∞
请输入一个整数:
4294967297
产生溢出异常
请输入一个整数:
hao123
产生转换异常
请输入一个整数:
5
该数的倒数是:0.2
相关文章:
C#学习笔记 - C#基础知识 - C#从入门到放弃 - C# 处理程序异常相关技术
C# 入门基础知识 - C# 处理程序异常相关技术 第11节 处理程序异常相关技术11.1 捕获异常11.2 清除、处理所有异常11.3 引发异常11.4 预定义异常类11.5 自定义异常类11.6 异常的综合运用 更多C#基础知识点可查看:C#学习笔记 - C#基础知识 - C#从入门到放弃 第11节 处…...
[python]项目怎么使用第三方库
要在Python项目中使用第三方库,可以按照以下步骤进行: 安装第三方库:使用pip命令安装要使用的第三方库。例如,要安装requests库,可以运行以下命令: pip install requests导入库文件:在Python项…...
java每日一题——双色球系统(答案及编程思路)
前言: 打好基础,daydayup! 题目:要求如下(同时:红球每个号码不可以相同) 编程思路:1,创建一个可以录入数字的数组;2,生成一个可以随机生成数字的数组…...
java的mybatis
一.spring 整合单元测试 二.lombok 三.注解方式开发 四.xml 方式开发 五.动态sql...
Linux驱动开发简易流程
推荐视频: 正点原子【第四期】手把手教你学 Linux之驱动开发篇 小智-学长嵌入式Linux&Android底层开发入门教程 能力矩阵 基础能力矩阵 熟悉c/c、熟悉数据结构 熟悉linux系统,Shell脚本,Makefile/cmake/mk 文件IO、多线程、竞争、并发…...
基于springboot的靓车汽车销售网站
🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅一 、设计说明 1.1 研究背景 随…...
爬取涛声网音频
代码展现: 代码详情: import requests import re import os filename 声音// if not os.path.exists(filename): os.mkdir(filename) def down_load(page): for page in range(page): page page1 url https://www.tosound.…...
如何快速且有效的学习自动化测试?
我写一个学习路线吧: 1.学习python基本语法。 2学习路线图 https://www.processon.com/view/link/64e729486ece22263c3e 学习HTML/CSS下的html、xml、webservice三个教程。 3. 然后下一个python的requests库学习写最简单的网络爬虫。知乎上爬虫教程一大堆。 3是…...
openmmlab大模型实战营01
与环境进行交互——智能体更合适 模型微调常见方式 模型评测 模型部署常见问题你 大语言模型本身不具备最新信息和知识的获取,此时需要搭建包含不同模块的智能体框架 智能体:以大语言模型为核心,进行规划、推理和执行...
HarmonyOS-ArkTS基本语法及声明式UI描述
初识ArkTS语言 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。因此,在学习ArkTS语言之前,建议开发者具备TS语…...
字符串转成时间的SQL,一个多种数据库通用的函数
select date 2010-10-06 from dual; date 函数,此函数适用于: 1.MySQL数据库 2.Oracle数据库 3.达梦数据库 4.人大金仓数据库...
CMake入门教程【核心篇】查找包(find_package)
😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「本文的内容」:CMake入门教程 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.使用方法1.1基本用…...
Stable Diffusion好用的显卡推荐
Stable Diffusion 是一款顶级的人工智能艺术生成工具,以其快速的性能、用户友好的界面和显着的效果而闻名。然而,在沉浸体验之前,有必要验证您的计算机(显卡)是否符合最佳功能所需的严格规范。今天我们将介绍三款高性价…...
Spring 对请求参数的优雅处方式(重写序列化方法)
Spring 对请求参数的优雅处方式(重写序列化方法) 描述前端传参方式介绍代码实现:1、重写序列化方式代码2、设置类自动加载到 Spring 中 描述 在我们日常项目开发过程中,往往会遇到前端请求参数中有空格的情况,前端提交…...
2024年中职“网络安全“—数字调查取证(attack817.pcapng)
目录 1.通过分析数据包找出恶意用户最初访问HTTP服务的包号,将该值作为Flag值提交, Flag格式为flag{xxx}; 2.继续查看数据包文件分析出恶意用户扫描了哪些端口,将全部的端口号按照一定顺序作为Flag值,提示:注意端口…...
如何使用VsCode编译C语言?
下载VsCode (1) 解压到D盘跟目录 (2) 运行[vscode.reg],注册右键菜单 (3) 进入[pack]文件夹,运行[install.bat]。安装基本插件。 下载mingw32 (1) 解压任意目录 (2) 我的电脑右键–高级系统设置–高级–环境变量–系统变量–Path(双击)–空白行(双击)–…...
SpringCloud 和 Linux 八股文第三期五问五答
SpringCloud 和 Linux 八股文第三期五问五答 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的! ⭐点赞⭐收藏⭐不迷路!⭐ 1)Linux常用命令 2)如何查看测试项目的日志 一…...
组件通信方式
组件通信方式有:vuex,ref,父子通信(父传子、子传父),兄弟通信(eventBus), 祖先后代通信(依赖注入) 父传子:父组件内:在子组件标签上设置自定义属…...
kbdnecnt.DLL文件缺失,软件或游戏无法启动运行,怎样快速修复?
不少人都在问“kbdnecnt.DLL文件”是什么?为什么电脑总是报错提示说“kbdnecnt.DLL文件缺失,软件无法启动”? 首先,先来了解“kbdnecnt.DLL文件”是什么? kbdnecnt.DLL是Windows操作系统中的一个动态链接库文件&#…...
Linux账户安全
一.Linux账户与组的基本概念 在Limux操作系统中,每一个文件和程序都归属于一个特定的 “用户”。每个用户都由一个唯一的身份来标识,这个标识称为用户ID (UserID, UID )。系统中的每一个用户也至少需要属于一个“用户分组”,即由系统管理员所…...
深度生成模型之GAN优化目标设计与改进 ->(个人学习记录笔记)
文章目录 深度生成模型之GAN优化目标设计与改进原始GAN优化目标的问题1. JS散度度量问题2. 梯度问题 优化目标的设计与改进1. 最小二乘损失GAN2. Energy-based GAN(EBGAN)3. Wasserstein GAN4. WGAN-GP5. Boundary Equilibrium GAN(BEGAN)6. Loss Sensitive GAN7. Relativeisti…...
程序员如何高效学习技术?
我们相信努力学习一定会有收获,但是方法不当,既让人身心疲惫,也没有切实的回报。 不少朋友每天都阅读技术文章,但是第二天就忘干净了。工作中领导和同事都认可你的沟通和技术能力,但是跳槽面试却屡屡碰壁。面试官问技术…...
一个无经验的大学毕业生,可以转行做软件测试吗?我的真实案例
在转行之前,我一直在思考,当代年轻人的真实生活情况究竟是什么样的。 朝九晚六,无休止的加班,每天往返于公司与家,没有一点点自己的生活,只能从心里面麻痹自己,以求得最后的慰籍。 这就是我之…...
三.Linux无名管道(PIPE)和有名管道(FIFO)的区别
目录 命名管道(Named Pipe): 无名管道(Anonymous Pipe): 总结: 无名管道(Anonymous Pipe)和命名管道(Named Pipe)都是进程间通信的机制&#x…...
英文字母替换加密(后移n位)
思路:首先写出后移(前移)1位的情况 , 然后逐渐累加至N位情况 #include <stdio.h> void test(char arr[] , int n ) { int i 0; int z 0; if( n < 0 ) { while( i ! n ) { …...
HAproxy群集
HAproxy群集 常见的集群调度器HAproxy 、nginx、LVS区别HAproxynginxlvs HAproxy介绍HAproxy特点HAproxy常见的负载均衡策略HAproxy会话保持HAproxy配置实例 常见的集群调度器 常见的web集群调度器分为软件和硬件 软件:LVS Haproxy nginx 硬件: F5 Ar…...
LeetCode2469. Convert the Temperature
文章目录 一、题目二、题解 一、题目 You are given a non-negative floating point number rounded to two decimal places celsius, that denotes the temperature in Celsius. You should convert Celsius into Kelvin and Fahrenheit and return it as an array ans [ke…...
【ROS2】MOMO的鱼香ROS2(五)ROS2入门篇——ROS2接口与自定义
ROS2接口与自定义 引言1 ROS2自带接口1.1 ROS2通用标准消息包1.2 ROS2传感器消息包1.3 ROS2几何相关消息包 2 ROS2接口介绍2.1 常用CLI命令2.2 原始数据类型与包装类型 3 自定义接口示例3.1 接口定义3.2 自定义接口RCLPY 引言 笔者跟着鱼香ROS的ROS2学习之旅 学习参考…...
python c语言 代码动态检查,python c语言语法分析
大家好,小编来为大家解答以下问题,python c语言 代码动态检查,python c语言语法分析,今天让我们一起来看看吧! Source code download: 本文相关源码 初学编程,应该学习哪一门编程语言,有不少人感…...
C++ DAY6 作业
1.用模板类写顺序表 #include <iostream>using namespace std;#define MAXSIZE 10 template <typename T> class Arr {T *data NULL;int len 0; public://构造函数Arr():data(new T){}Arr(T a,int len):data(new T(a)),len(len){}//析构函数~Arr(){delete data;}…...
东莞凤岗网站建设制作/快照关键词优化
浙大版《Python 程序设计》题目集 第2章-14 求整数段和 (15分) 给定两个整数A和B,输出从A到B的所有整数以及这些数的和。 输入格式: 输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。 输出格式:…...
商务网站设计/百度网页版链接
作者:贾春生,http://dwz.win/mygSELECT COUNT( * ) FROM TABLE 是个再常见不过的 SQL 需求了。在 MySQL 的使用规范中,我们一般使用事务引擎 InnoDB 作为(一般业务)表的存储引擎,在此前提下,COUNT( * )操作的时间复杂度…...
网站开发需要什么/谷歌seo外包公司哪家好
【问题描述】N-S图,也被称为盒图或NS图(Nassi Shneiderman图)。是结构化编程中的一种可视化建模。1972年,美国学者I.Nassi 和 B.Shneiderman提出了一种在流程图中完全去掉流程线,全部算法写在一个矩形阵内,在框内还可以包含其他框…...
深一网站建设/十大免费无代码开发软件
早晨起床时间:12:30 晚上休息时间:0:28 今日总结:休息中。...
湖北省城乡建设厅网站/网络营销推广的方式有哪些
官方下载地址是:http://www.xdp.it/cximage/ 打开工程后可以看到下例这些工程: - CxImage - CxImageCrtDll - CxImageMfcDll - dome - domeDll - jasper - jbig - jpeg - libdcr - mng - png - tiff - zlib 1。首先我们要确定在程序中是希望静态链接还是…...