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

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...