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

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#中,有许多预定义的异常类,它们分别用于表示不同类型的异常情况。以下是一些常见的预定义异常类的简要介绍:

异常类说明
ExceptionException是所有异常类的基类,它表示通用的异常情况。一般情况下,我们不直接使用Exception类,而是使用它的子类。
SystemExceptionSystemException是Exception的子类,它代表由.NET框架或CLR引发的异常。例如,NullReferenceException和DivideByZeroException都是SystemException的子类。
ApplicationExceptionApplicationException是Exception的子类,它代表由应用程序代码引发的异常。通常,我们可以通过自定义的方式来创建派生自ApplicationException的自定义异常类。
ArgumentExceptionArgumentException代表参数异常,表示一个或多个方法参数不符合预期。它有一些常见的子类,如ArgumentNullException(参数为null),ArgumentOutOfRangeException(参数超出有效范围)等。
InvalidOperationExceptionInvalidOperationException表示在对象的当前状态下,操作是无效的或不合理的异常。这个异常通常在对象的状态不允许执行某个操作时引发。
IndexOutOfRangeExceptionIndexOutOfRangeException表示索引超出范围的异常,通常在数组或集合访问时发生。
NullReferenceExceptionNullReferenceException表示空引用异常,当尝试通过对null引用进行成员访问、方法调用或属性访问时,会引发此异常。
DivideByZeroExceptionDivideByZeroException表示除以零的异常,当对一个数字类型进行除法运算时,除数为零时会引发此异常。

【部分异常类示例】
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、继承预定义的异常类:
要创建自定义异常类,首先要选择一个适合的预定义异常类作为基类。通常,如果可以找到与自定义异常类型相关的现有预定义异常类,那么最好继承那个异常类。基于自定义异常的性质和用途,可以选择继承的异常类,如ExceptionApplicationException等。

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#基础知识点可查看&#xff1a;C#学习笔记 - C#基础知识 - C#从入门到放弃 第11节 处…...

[python]项目怎么使用第三方库

要在Python项目中使用第三方库&#xff0c;可以按照以下步骤进行&#xff1a; 安装第三方库&#xff1a;使用pip命令安装要使用的第三方库。例如&#xff0c;要安装requests库&#xff0c;可以运行以下命令&#xff1a; pip install requests导入库文件&#xff1a;在Python项…...

java每日一题——双色球系统(答案及编程思路)

前言&#xff1a; 打好基础&#xff0c;daydayup! 题目&#xff1a;要求如下&#xff08;同时&#xff1a;红球每个号码不可以相同&#xff09; 编程思路&#xff1a;1&#xff0c;创建一个可以录入数字的数组&#xff1b;2&#xff0c;生成一个可以随机生成数字的数组&#xf…...

java的mybatis

一.spring 整合单元测试 二.lombok 三.注解方式开发 四.xml 方式开发 五.动态sql...

Linux驱动开发简易流程

推荐视频&#xff1a; 正点原子【第四期】手把手教你学 Linux之驱动开发篇 小智-学长嵌入式Linux&Android底层开发入门教程 能力矩阵 基础能力矩阵 熟悉c/c、熟悉数据结构 熟悉linux系统&#xff0c;Shell脚本&#xff0c;Makefile/cmake/mk 文件IO、多线程、竞争、并发…...

基于springboot的靓车汽车销售网站

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1 研究背景 随…...

爬取涛声网音频

代码展现&#xff1a; 代码详情&#xff1a; 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.…...

如何快速且有效的学习自动化测试?

我写一个学习路线吧&#xff1a; 1.学习python基本语法。 2学习路线图 https://www.processon.com/view/link/64e729486ece22263c3e 学习HTML/CSS下的html、xml、webservice三个教程。 3. 然后下一个python的requests库学习写最简单的网络爬虫。知乎上爬虫教程一大堆。 3是…...

openmmlab大模型实战营01

与环境进行交互——智能体更合适 模型微调常见方式 模型评测 模型部署常见问题你 大语言模型本身不具备最新信息和知识的获取&#xff0c;此时需要搭建包含不同模块的智能体框架 智能体&#xff1a;以大语言模型为核心&#xff0c;进行规划、推理和执行...

HarmonyOS-ArkTS基本语法及声明式UI描述

初识ArkTS语言 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。因此&#xff0c;在学习ArkTS语言之前&#xff0c;建议开发者具备TS语…...

字符串转成时间的SQL,一个多种数据库通用的函数

select date 2010-10-06 from dual; date 函数&#xff0c;此函数适用于&#xff1a; 1.MySQL数据库 2.Oracle数据库 3.达梦数据库 4.人大金仓数据库...

CMake入门教程【核心篇】查找包(find_package)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1.使用方法1.1基本用…...

Stable Diffusion好用的显卡推荐

Stable Diffusion 是一款顶级的人工智能艺术生成工具&#xff0c;以其快速的性能、用户友好的界面和显着的效果而闻名。然而&#xff0c;在沉浸体验之前&#xff0c;有必要验证您的计算机&#xff08;显卡&#xff09;是否符合最佳功能所需的严格规范。今天我们将介绍三款高性价…...

Spring 对请求参数的优雅处方式(重写序列化方法)

Spring 对请求参数的优雅处方式&#xff08;重写序列化方法&#xff09; 描述前端传参方式介绍代码实现&#xff1a;1、重写序列化方式代码2、设置类自动加载到 Spring 中 描述 在我们日常项目开发过程中&#xff0c;往往会遇到前端请求参数中有空格的情况&#xff0c;前端提交…...

2024年中职“网络安全“—数字调查取证(attack817.pcapng)

目录 ​1.通过分析数据包找出恶意用户最初访问HTTP服务的包号&#xff0c;将该值作为Flag值提交, Flag格式为flag{xxx}&#xff1b; 2.继续查看数据包文件分析出恶意用户扫描了哪些端口&#xff0c;将全部的端口号按照一定顺序作为Flag值&#xff0c;提示&#xff1a;注意端口…...

如何使用VsCode编译C语言?

下载VsCode (1) 解压到D盘跟目录 (2) 运行[vscode.reg]&#xff0c;注册右键菜单 (3) 进入[pack]文件夹&#xff0c;运行[install.bat]。安装基本插件。 下载mingw32 (1) 解压任意目录 (2) 我的电脑右键–高级系统设置–高级–环境变量–系统变量–Path(双击)–空白行(双击)–…...

SpringCloud 和 Linux 八股文第三期五问五答

SpringCloud 和 Linux 八股文第三期五问五答 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;Linux常用命令 2&#xff09;如何查看测试项目的日志 一…...

组件通信方式

组件通信方式有&#xff1a;vuex&#xff0c;ref&#xff0c;父子通信&#xff08;父传子、子传父&#xff09;&#xff0c;兄弟通信(eventBus)&#xff0c; 祖先后代通信&#xff08;依赖注入&#xff09; 父传子&#xff1a;父组件内&#xff1a;在子组件标签上设置自定义属…...

kbdnecnt.DLL文件缺失,软件或游戏无法启动运行,怎样快速修复?

不少人都在问“kbdnecnt.DLL文件”是什么&#xff1f;为什么电脑总是报错提示说“kbdnecnt.DLL文件缺失&#xff0c;软件无法启动”&#xff1f; 首先&#xff0c;先来了解“kbdnecnt.DLL文件”是什么&#xff1f; kbdnecnt.DLL是Windows操作系统中的一个动态链接库文件&#…...

Linux账户安全

一.Linux账户与组的基本概念 在Limux操作系统中&#xff0c;每一个文件和程序都归属于一个特定的 “用户”。每个用户都由一个唯一的身份来标识&#xff0c;这个标识称为用户ID (UserID, UID )。系统中的每一个用户也至少需要属于一个“用户分组”&#xff0c;即由系统管理员所…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...