当前位置: 首页 > 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;即由系统管理员所…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

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…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...

Android屏幕刷新率与FPS(Frames Per Second) 120hz

Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数&#xff0c;单位是赫兹&#xff08;Hz&#xff09;。 60Hz 屏幕&#xff1a;每秒刷新 60 次&#xff0c;每次刷新间隔约 16.67ms 90Hz 屏幕&#xff1a;每秒刷新 90 次&#xff0c;…...