C#异常总结

news2024/9/28 3:29:26

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.coloradmin.cn/o/712176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ICC2:fixed和locked有什么不同?

如题,physical status中locked与fixed有很多小伙伴会搞混,从实用性的角度来讲这两个并没有什么区别,一是工具都不会更改object这两种属性,二是工具都不会在优化过程中移除这两个属性的object。 所以,唯一的区别在于lo…

【JUC-4】线程池实战应用

线程池 线程池创建方式 Executors创建线程池(不推荐) JDK提供的工具类Execurtors创建线程池(不推荐), 列举几个Executors中创建线程池的方法; 查看Executors的源代码发现, 它创建线程池也是通过 new ThreadPoolExecutor() 来创建线程池的. 当然其中有一些特殊的线程池也不是…

Moka AI产品后观察:HR SaaS迈进AGI时代

在AI这条路上,Moka已经走了很远。如今的Moka Eva是在此前AI模型基础上的更进一步。未来AGI时代,HR SaaS会有更多可能性。 出品|产业家 在AI潮水里,Moka正在加速快跑。 在6月28日的2023夏季新品发布会上,国内首个AI原生HR Saa…

流量卡收货地就是归属地,这是什么意思呢?

我们在网上申请流量卡时,会比较关注流量卡归属地这一问题,据小编了解,目前网上的流量卡归属地有两种模式,接下来,小编一一为大家介绍一下,大家可以根据自己的情况来选择。 ​ 在中国的手机号码都有固定的区…

【MySQL】备份数据(导出数据 / 导入数据)

🎯导出数据 1、使用 SELECT ... INTO OUTFILE 语句导出数据 SELECT...INTO OUTFILE 是 MySQL 用于导出数据的语句,它允许将查询结果保存到指定的文件中。 该语句的基本语法如下: SELECT column1, column2, ... INTO OUTFILE file_path …

Kotlin~Template模版方法模式

概念 定义算法骨架、代码模版 角色介绍 Abstract ClassConcrete Class UML 代码实现 abstract class Game {protected abstract fun initialize()protected abstract fun startPlay()protected abstract fun endPlay()// 模版fun play(){initialize()startPlay()endPlay()…

Spring面试题--Spring中事务失效的场景有哪些

Spring中事务失效的场景有哪些? 异常捕获处理 Transactional public void update(Integer from, Integer to, Double money) {try {//转账的用户不能为空Account fromAccount accountDao.selectById(from);//判断用户的钱是否够转账if (fromAccount.getMoney() - …

idea运行项目时右下角一直提示Lombok requires enabled annotation processing

出现这个错误是因为使用了Lombok插件的原因,可能是安装时候没有配置好 Lombok requires enabled annotation processing:翻译过来就是Lombok 需要启用注释处理 解决方案 File -> Settings ->Build,Execution,Deployment -> Compiler ->An…

35岁程序员现状,太真实!

“未来每年,我们将会为社会输送1000名工作10年以上的人才。” 这是之前马云在演讲中提到的关于阿里巴巴这样的大厂老员工的问题。总的来讲就是——“毕业”。 也经常能够看到在各个平台有程序员讲到自己35岁的焦虑。 之前,在某平台上就有一个有意思的…

Redis主从复制模式3

谋权篡位 假设在一个Redis集群中,有一台主机和两台从机构成一个Redis集群。此时因外部原因,导致主机宕机,俗话说 “国不可⼀一日无君,军不可一日无帅”,那么需要从剩余的两台从机中再次选出一台主机,从而来…

【小沐学Unity3d】Unity插件之绳索模拟Obi Rope

文章目录 1、简介2、安装3、示例测试3.1 Chains3.2 Crane3.3 ElectricalWires3.4 FreightLift3.5 Rocker3.6 RopeAndJoints3.7 RopeShowcase 4、简单测试结语 1、简介 https://assetstore.unity.com/packages/tools/physics/obi-rope-55579 Obi 是一款基于粒子的高级物理引擎…

本地部署 Chatbot UI,一个开源的 ChatGPT UI

openchat-ui 0. 什么是 Chatbot UI1. Github 地址2. 本地部署3. (参考)配置文件说明 0. 什么是 Chatbot UI Chatbot UI 是一个用于 AI 模型的开源聊天 UI。适用于 OpenChat 模型。 画面效果展示如下, 1. Github 地址 https://github.com/imoneoi/openchat-ui 2.…

Docker安装RabbitMQ docker安装RabbitMQ完整详细教程

Docker安装RabbitMQ docker安装RabbitMQ完整详细教程 Docker 上安装 RabbitMQ 3.12 的步骤:选择要安装的RabbitMQ 版本1、拉取 RabbitMQ 镜像2、创建并运行容器3、RabbitMQ 常用端口以及作用4、访问 管理页面测试,是否启动成功关闭容器启动容器 5、Docke…

OpenResty cosocket

cosocket 是各种 lua-resty-* 非阻塞库的基础 cosocket coroutine socket 需要 Lua 协程特性的支持,也需要 Nginx 事件机制的支持,两者结合在一起实现非阻塞网络 I/O。 遇到网络 I/O 时会交出控制权,把网络事件注册到 Nginx 监听列表中&a…

OpenSSH 用户枚举漏洞(CVE-2018-15473) 漏洞修复

OpenSSH 用户枚举漏洞(CVE-2018-15473)漏洞修复 1 漏洞说明2 漏洞修复3 相关问题 1 漏洞说明 2 漏洞修复 查看当前openssh版本: [rootizr0a05u4qferpr7yfhtotz ~]# ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 [rootizr0a05u4…

ChatGLM-6B一键安装,马上使用(windows)!!

产品特点 双语: 同时支持中文和英文。 高精度(英文): 在公开的英文自然语言榜单 LAMBADA、MMLU 和 Big-bench-lite 上优于 GPT-3 175B(API: davinci,基座模型)、OPT-175B 和 BLOOM-176B。 高…

MiniKube安装教程,简易版k8s,带你用最简单的方法体验k8s(学习环境通用)

Minikube安装教程 minikube 是本地 Kubernetes,专注于让 Kubernetes 易于学习和开发,这能很方便的在本地进行k8s学习,减轻初学者对于k8s的安装困难。(信我,新手入门k8s就用这个够用了!先别去折腾生产环境的…

[pyqt5]右键窗口弹出菜单并触发菜单点击事件

from PyQt5.Qt import * import sysclass MyWindow(QWidget):# 自定义窗体def contextMenuEvent(self, evt: QContextMenuEvent) -> None:menu QMenu(self)new_action QAction(打开, menu)new_action.triggered.connect(self.open)close_action QAction(关闭, menu)close…

Jupyter的安装与启动

一、简介 Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。 Jupyter Notebook是一个开源的Web应用程序,允许用户创建和共享包含代码、方程式、可视化和文本的文档,支持…

【编码魔法师系列_六大原则2】里氏替换原则(Liskov Substitution Principle LSP Principle)

学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性、可维护性和可重用性,从而让我们的开发效率更高。通…