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 )。系统中的每一个用户也至少需要属于一个“用户分组”,即由系统管理员所…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
