C#异常总结

C#异常总结

    • 定义
    • Try语句
    • 异常类
    • 创建用户自定义异常
    • 搜索调用栈的示例
    • 异常抛出

定义

程序中的运行时错误,它违反一个系统约束或应用程序约束,或出现了在正常操作时未预料的情形。

Try语句

指明被异常保护的代码块,并提供代码以处理异常。try由三部分组成:try…catch finally.

try:包含正被异常保护的代码

catch:含有一个或多个catch子句,这些是处理异常的代码块,也叫做异常处理程序

finally:含有在所有情况下都要被执行的代码,无论有没有异常发生
在这里插入图片描述

异常类

BCL定义了许多类,每一个类代表一个指定的异常类型,当一个异常发生时,CLR:

  • 创建该类型的异常对象
  • 寻找适当的catch子句以处理 它

所有异常类都从根本上派生自system.exception类,异常继承层次如下
在这里插入图片描述

异常类类型包括:基类:System.Exception;系统级异常:System.SystemException;应用程序级异常:System.ApplicationException。

(1).由System.SystemException派生的异常类型:

System.AccessViolationException在试图读写受保护内存时引发的异常。
System.ArgumentException在向方法提供的其中一个参数无效时引发的异常。
System.Collections.Generic.KeyNotFoundException指定用于访问集合中元素的键与集合中的任何键都不匹配时所引发的异常。
System.IndexOutOfRangeException访问数组时,因元素索引超出数组边界而引发的异常。
System.InvalidCastException因无效类型转换或显示转换引发的异常。
System.InvalidOperationException当方法调用对于对象的当前状态无效时引发的异常。
System.InvalidProgramException当程序包含无效Microsoft中间语言(MSIL)或元数据时引发的异常,这通常表示生成程序的编译器中有bug。
System.IO.IOException发生I/O错误时引发的异常。
System.NotImplementedException在无法实现请求的方法或操作时引发的异常。
System.NullReferenceException尝试对空对象引用进行操作时引发的异常。
System.OutOfMemoryException没有足够的内存继续执行程序时引发的异常。
System.StackOverflowException挂起的方法调用过多而导致执行堆栈溢出时引发的异常。

(2).由System.ArgumentException派生的异常类型:

System.ArgumentNullException当将空引用传递给不接受它作为有效参数的方法时引发的异常。
System.ArgumentOutOfRangeException当参数值超出调用的方法所定义的允许取值范围时引发的异常。

(3).由System.ArithmeticException派生的异常类型:

System.DivideByZeroException试图用零除整数值或十进制数值时引发的异常。
System.NotFiniteNumberException当浮点值为正无穷大、负无穷大或非数字(NaN)时引发的异常。
System.OverflowException在选中的上下文中所进行的算数运算、类型转换或转换操作导致溢出时引发的异常。

(4).由System.IOException派生的异常类型:

System.IO.DirectoryNotFoundException当找不到文件或目录的一部分时所引发的异常。
System.IO.DriveNotFoundException当尝试访问的驱动器或共享不可用时引发的异常。
System.IO.EndOfStreamException读操作试图超出流的末尾时引发的异常。
System.IO.FileLoadException当找到托管程序却不能加载它时引发的异常。
System.IO.FileNotFoundException试图访问磁盘上不存在的文件失败时引发的异常。
System.IO.PathTooLongException当路径名或文件名超过系统定义的最大长度时引发的异常。

(5).其他常用异常类型:

ArrayTypeMismatchException试图在数组中存储错误类型的对象。
BadImageFormatException图形的格式错误。
DivideByZeroException除零异常。
DllNotFoundException找不到引用的dll。
FormatException参数格式错误。
MethodAccessException试图访问私有或者受保护的方法。
MissingMemberException访问一个无效版本的dll。
NotSupportedException调用的方法在类中没有实现。
PlatformNotSupportedException平台不支持某个特定属性时抛出该错误。

创建用户自定义异常

自定义的异常类派生自ApplicationException类

    class Program{static void Main(string[] args){//用户自定义的异常类是派生自ApplicationException类Temperture temp = new Temperture();try{temp.showTemp();}catch(TempIsZeroException e){Console.WriteLine("TempIsZeroException:{0}", e.Message);}Console.ReadKey();}}//创建自定义异常public class TempIsZeroException:ApplicationException{ public TempIsZeroException(string message):base(message){}}public class Temperture{int temperature = 0;public void showTemp(){if(temperature==0){throw (new TempIsZeroException("Zero Temperature found"));}else{Console.WriteLine("Temperature:{0}", temperature);}}}

搜索调用栈的示例

    class Program{static void Main(string[] args){Myclass MCLs = new Myclass();try{MCLs.A();}catch(DivideByZeroException e){Console.WriteLine("catch clause in Main()");}finally{Console.WriteLine("finally clause in Main()");}Console.WriteLine("After try statement in Main");Console.WriteLine("----------------------keep runing");Console.ReadKey();}}class Myclass{public void A(){try{B();}catch(System.NullReferenceException){Console.WriteLine("catch clause in A()");}finally{Console.WriteLine("finally clause in A()");}}void B(){int x = 10, y = 0;try{x /= y;}catch(System.IndexOutOfRangeException){Console.WriteLine("catch clause in B()");}finally{Console.WriteLine("finally clasue in B()");}}}
  • Main调用A,调用B,B遇到一个DivideByZeroExceprion异常。
  • 系统检查B的catch段寻找匹配的catch子句。虽然它有一个Index0ut0fRangeException的子句,但没有DivideByZerException的。
  • 系统然后延着调用栈向下移动并检查A的catch段,在那里它发现A也没有匹配的atch子句
  • 系统继续延调用栈向下,并检查Main的catch子句部分,在那里它发现Main确实有一个DivideByZeroException的catch子句。
  • 尽管匹配的catch子句现在被定位了,但并不执行。相反,系统回到栈的顶端,执行B的finally子句,并把B从调用栈中弹出。
  • 系统移动到A,执行它的fina]1y子句,并把A从调用栈中弹出。
  • 最后,Main的匹配catch子句被执行,接着是它的fina11y子句。然后执行在Main的try语句结尾之后继续。

在这里插入图片描述

异常抛出

可以使用throw语句显式引发一个异常,语法如下:

throw ExceptionObject
    class Program{static void Main(string[] args){//带对象的异常抛出string s = null;Myclass.PrintArg(s);Myclass.PrintArg("hello world");Myclass01.PrintArg(s);Console.ReadKey();}}class Myclass{public static void PrintArg(string arg){try{if(arg==null){ArgumentNullException myEx = new ArgumentNullException("arg");throw myEx;}}catch (ArgumentNullException e){Console.WriteLine("Message:{0}", e.Message);}}}class Myclass01{public static void PrintArg(string arg){try{try{if(arg == null){ArgumentNullException myEx = new ArgumentNullException("arg");throw myEx;}Console.WriteLine(arg);}catch(ArgumentNullException e){Console.WriteLine("Inner catch:{0}", e.Message);throw;//重新抛出异常,没有附加参数}}catch{Console.WriteLine("Outer catch:Handling an Exception.");}}}

本文参考C#图解教程以及博文C#处理Exception的常用方法总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/9708.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】支持向量机(下)

支持向量机(下) 目录 八、支持向量机的求解实例九、核函数1、核函数的引入2、核函数的示例 十、软间隔1、何为软间隔2、引入软间隔后的目标方程 十一、正则化十二、关于支持向量机的分类十三、数据标准化的影响【机器学习】支持向量机(上&…

Segment Anything:突破边界的图像分割新技术解析

Segment Anything论文地址:https://arxiv.org/pdf/2304.02643.pdf Segment Anything:突破边界的图像分割新技术解析 论文背景Segment Anything任务方法Segment Anything 模型架构图像编码器(Image Encoder)提示编码器(…

Java JSP实战

综合实战: 实现利用servletservicedao实现查询所有,对象,增删改, t_house(int no,String housename,Double height) 步骤1:创建maven工程 步骤2:创建工程包entity,dao,util,service,servlet 步骤3&#x…

接口抓包分析与Mock实战

这里写目录标题 一、知识点梳理1、接口抓包需要具备的能力2、接口抓包原理 二、Charles 基础使用三、charles抓包分析四、Charles 使用1、过滤:Filter、Focus2、重发:Repeat、Repeat Advanced3、修改请求:Compose4、弱网:Throttle…

npm包管理器

一、什么是npm Npm(Node Package Manager)是一个用于管理和共享JavaScript代码包的包管理器。它是Node.js的默认包管理工具,也是世界上最大的软件注册表之一。下面从不同的角度来详细介绍Npm包管理器。 1. 功能与用途: 包安装与…

FPGA USB FX2 图片发送试验 驱动CY7C68013A实现 提供2套工程源码和技术支持

目录 1、前言2、我这儿已有的 FPGA USB 通信方案3、CY7C68013A芯片解读和硬件设计FX2 简介SlaveFIFO模式及其配置 4、工程详细设计方案输入测试图片的处理PC上位机发送测试图片图像接收与缓存图像输出显示 5、vivado工程1--LCD输出显示6、vivado工程1--LCD输出显示7、上板调试验…

Labview通过OPC与S1200通信

一、配置PC的IP地址 二、S7-1200的配置 通过博图,在PLC CPU的属 性-常规-保护里勾选“允许从 远程伙伴使用PUT/GET通信 访问 三、新建一个DB1数据块,在DB1里新建一个变量,例如 名称为“ASD”,类型为“Word” 四、右击“DB1”&…

超详细,Pytest自动化测试框架 token全局设置-多套环境使用(实战)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 在做自动化测试时…

MySQL安装部署

目录 1、仓库安装 2、本地安装 3、容器安装 4、源码安装 5、二进制安装 环境:centOS7 1、仓库安装 1、上传安装包 2、解压 mkdir mysql ; tar xf 安装包 -C mysql 3、安装 ls -l mysq1-community* rpm -ivh mysql-community-server-5.7.18-.el7.x86_64.rpm (…

Zookeeper的选举机制

一、概述: Zookeeper的选举机制是它的一项核心功能,用于在分布式系统中选择一个领导者(leader)来处理各种请求和操作。以下是Zookeeper选举机制的一些关键方面: 服务器ID(Server ID)&#xff…

Flutter基础控件

Text:文字 Text("Flutter") Text是最常用也是最基础的,目前学习阶段只用来加载文字数据,更多属性和样式设置请查看源码自己探索。 Button:按钮 ElevatedButton:普通按钮 ElevatedButton(onPressed: () {if (kDebugMode) {print("Elevat…