常见异常类及异常对象属性

  程序运行的过程中,会发生各种非正常状况,比如程序运行时磁盘空间不足,网络连接中断,被操作的文件不存在。(异常在程序运行时发生)
  针对这种情况下,C#程序引入了异常处理机制,通过异常处理机制对程序运行时出现的各种问题进行处理。

语法错误(编译错误)——编辑器
逻辑错误——程序调试
语义错误(运行错误)——异常处理

C#提供了大量的异常类,这些类都继承自Exception类。
Exception类是所有异常类的基类,它包含在System命名空间内,该类的对象可以捕获任何类型的异常,其他派生类的对象只能捕获相应类类型的异常。

  1. MemberAccessException:类型成员不能被访问
  2. ArgumentException:所有参数异常的基类
  3. ArgumentNullException:参数为空
  4. ArgumentOutOfRangeException:参数不在给定的范围内
  5. ArithmeticException:算术运算、类型转换或转换操作中的错误
  6. ArrayTypeMismatchException:与数组类型不匹配
  7. DivideByZeroException:除数为0
  8. FormatException:参数的格式不正确
  9. OutOfMemoryException: 内存不足
  10. OverflowException:数据溢出
  11. IndexOutOfRangeException:数组下标出界
  12. NullReferenceException:空对象被引用
  13. InvalidOperationException:方法调用对于对象的当前状态无效

每个异常对象都包含一些只读属性,这些属性可以描述异常的信息,通过这些属性可以更准确的找到异常出现的原因。

  1. Message string 此属性含有解释异常原因的消息
  2. StackTrace string 此属性含有描述异常发生在位置信息
  3. InnerException Exception 如果当前异常是由另一个异常引起的,此属性包含前一个异常的引用
  4. HelpLink string 此属性为异常原因信息提供URN或在RUL
  5. Source string 此属性含有异常起源所在的程序集的名称

try…catch 和 finally 及 throw

1、try…catch和finally
  由于发生了异常程序会立即终止,无法继续向下执行了。C#程序中提供了一种对异常进行处理的方式——异常捕获。

try
{//程序代码块(可能出现问题的代码块)
}
catch(ExceptionType e)//可以是Exception类及其子类
{//对异常的处理
}

  try代码块:用于处理可能发生的异常语句,catch代码块中是针对异常进行处理的语句。当try代码块中的语句发生了异常,就会交给catch块进行匹配
  在C#中catch代码块有三种形式,分别用于处理不同级别的异常

  1. 一般的catch代码块:catch后面没有任何内容,可以匹配try代码块中任意类型的异常。
catch
{//对异常的处理
}
  1. 特定catch代码块:catch后带有异常类型,可以匹配该类型的所有异常。
catch(Exceptiontype)
{//对异常的处理
}
  1. 带对象的catch代码块:catch后不久带有异常类型,还带有异常对象,通过异常对象可以获取异常信息。
catch(Exceptiontype InstID)
{//对异常的处理
}

  在程序中可以使用多个catch块对异常进行捕获,但只有一个catch块可以捕获到异常,并对异常进行处理,因为当程序发生异常时,系统会按照catch代码块的先后顺序对异常进行捕获。

  因此,这就需要将带有异常对象的catch块放在第一位,让其获取最准确的异常信息,然后将带有异常类型的catch块放在第二位,将一般的catch块放在最后,用于处理前面catch代码块都不能捕获的异常。

  在程序中,希望有些与其无论程序是否发生异常都要执行,可以在try…catch语句之后加上一个finally代码块。

  在程序设计时,经常会再try…catch后使用finally代码块来完成必须要做的事情,例如释放系统资源、关闭数据库的链接。

  注意:在程序中使用异常语句时,try代码块必须有的,而catch代码块和finally代码块必须要有一个,否则会出现编译错误。

  throw关键字
当程序中出现异常时,不仅可以通过try…catch代码块捕获异常,还可以使用throw关键字抛出异常对象。该异常对象可以被上层try…catch代码块捕获处理,也可以不做处理。

static void Main(string[] args)
{//创建一个异常对象并抛出throw new Exception("这是一个异常");
}

命名空间与程序集

1、命名空间
在实际开发过程中,除了自己编写的程序外还存在引用其他程序的情况,这时可能会碰到类名相同的情况。为此,C#中引入了命名空间这个概念,可以将命名空间理解为程序定义的一个目录,使用命名空间可以有效避免类名冲突的问题。

namespace Example
{class Animal{void Shout(){Console.WriteLine("动物的叫声");}} 
}

namespace是表示命名空间的关键字,Example表示命名空间名,在实际开发中,命名空间都是以公司名或者项目名为前缀的。
注意:创建项目时项目的名称就是默认命名空间的名字。
当程序中需要调用其他命名空间的类时,可以在程序中使用完整的限定名。

static void Main(string[] args)
{Example.Animal animal=new Example.Animal();Console.ReadKey();
}

由于使用完全限定名的方式不利于程序代码的阅读而且会导致代码的冗余,所以C#中还可以使用using关键字添加对命名空间的引用,这样在程序中调用其他命名空间下的类时就可以直接使用,而无需使用完整的限定名。

using Example;//引用命名空间
namespace aaa
{static void Main(string[] args){Animal animal=new Animal();Console.ReadKey();}
}

这往往是在不同的项目下,由于所处命名空间的不同,才需要引入命名空间,不过还需要再项目添加引用,即是添加要所引用命名空间的程序集。

程序集
  在实际开发中除了使用本身项目中的类,还有可能会用到其他程序中的类,此时就需要使用程序集(扩展名为.dll或exe),所谓的程序集就是包含一个或多个类型的定义文件和资源文件的集合,该程序集中的文件可以被其他程序使用。程序集文件可分为四个部分,分别是程序集清单元数据CIL资源集

  具体步骤
1、创建类库
新建一个项目,项目类型为类库。Program1
2、编写代码

public class Class1{public void print(){Console.WriteLine("引用程序集Program23.dll");Console.ReadKey();}}

运行该项目,此时就可以在当前项目中的Debug目录中生成一个Program1.dll的程序集。说明:直接运行出现“无法直接启动带有类库输出类型的项目”,但是只要一运行虽出现错误提示,但是相应的程序集文件还是生成了。
3、引用程序集
新建控制台应用程序项目program2,在该项目的解决方案资源管理器中找到【引用】,右击——【添加引用】——浏览到程序集文件Program1.dll。
4、使用程序集中的类
在program2中通过using program1引用程序集,然后就可以在program2中使用program1中的类了。
说明:只要是跨项目的引用,使用方法都与上类似,当然添加的不一定就是dll文件,还有可能是exe文件。

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

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

相关文章

第十回 朱贵水亭施号箭 林冲雪夜上梁山-FreeBSD/Linux 控制台基础操作

林冲被众庄客捉住,吊在门楼下,正被打时,柴进来了,赶快把林冲救下来。原来这是柴进打猎用的小庄子, 林冲就把火烧草料场一事跟柴进详细的说了。柴进说兄弟真是命运多磨难啊。林冲住了几日,恐怕连累柴进&…

柠檬微趣面试准备

简单介绍一下spring原理 Spring框架是一个开源的Java应用程序框架,它提供了广泛的基础设施支持,帮助开发者构建Java应用程序。Spring的设计原则包括依赖注入(DI)和面向切面编程(AOP)等,以促使代…

rust嵌入式之用类函数宏简写状态机定义

笔者一向认为,用有限状态自动机来做硬件控制是最好的选择,同时又倾向于用文本定义来定义状态机是更好的做法。所以此次用rust开发嵌入式自然也是如此。 状态机实现起来很简单,关键是用文本来定义状态机,在rust中,自然…

Laykefu客服系统 任意文件上传漏洞复现

0x01 产品简介 Laykefu 是一款基于workerman+gatawayworker+thinkphp5搭建的全功能webim客服系统,旨在帮助企业有效管理和提供优质的客户服务。 0x02 漏洞概述 Laykefu客服系统/admin/users/upavatar.html接口处存在文件上传漏洞,而且当请求中Cookie中的”user_name“不为…

[学习笔记]刘知远团队大模型技术与交叉应用L3-Transformer_and_PLMs

RNN存在信息瓶颈的问题。 注意力机制的核心就是在decoder的每一步,都把encoder的所有向量提供给decoder模型。 具体的例子 先获得encoder隐向量的一个注意力分数。 注意力机制的各种变体 一:直接点积 二:中间乘以一个矩阵 三:…

找不到vcruntime140_1.dll无法继续执行怎么办?全面分析修复方法

当系统提示vcruntime140_1.dll文件出现错误时,可能会引发一系列影响计算机正常运行的问题。这个特定的动态链接库文件(DLL)是Microsoft Visual C Redistributable的一部分,对于许多基于Windows的应用程序来说至关重要。一旦vcrunt…

如何在供应链管理中有效管理供应商和采购成本

一、管理供应商 在供应链管理中,供应商的管理是至关重要的环节。有效的供应商管理不仅可以确保稳定的原材料供应,还可以降低采购成本,提高企业的竞争力。以下是一些管理供应商的有效方法: 供应商评估与选择在选择供应商之前,企业需要对潜在供应商进行全面的评估。评估标准…

回归预测 | Python基于ALO-BiGRU蚁狮优化算法优化双向BiGRU多变量回归预测+适应度曲线+多个评价指标

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 ALO算法是Mirjalili于2015提出的一种新型元启发式群智能算法。由于引入了随机游走、轮盘赌策略及精英策略,使得 ALO 算法成为一种种群多样、寻优性能强、调节参数少、易于实现的搜索技术 python代码 优化参…

JS之Math

一提到数学,就想到被数学支配的噩梦,只不过这个数学用在了代码当中,那么代码当中的数学对象又是什么样的呢?让我为大家简单介绍一下吧! 数学对象常用方法: 常用方法简述ceil向上取整floor向下取整round四舍…

线段树详解

什么是线段树? 1、线段树是一棵二叉搜索树,它储存的是一个区间的信息。 2、每个节点以结构体的方式存储,结构体包含以下几个信息: 区间左端点、右端点;(这两者必有) 这个区间要维护的信息&…

【leetcode】移除元素

大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一.暴力求解法二.使用额外数组三.原地修改数组 点击查看题目 一.暴力求解法 若我们不考虑时间复杂度…

【题目】2023年国赛信息安全管理与评估正式赛任务书-模块3 CTF

全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 任务书 模块三 网络安全渗透、理论技能与职业素养 竞赛相关资源资料可在文末关注公众号获得 比赛时间及注意事项 本阶段比赛时长为180分钟,时间为9:00-12:00。 【注意事项】 (1&#xf…

算法优化:LeetCode第122场双周赛解题策略与技巧

接下来会以刷常规题为主 &#xff0c;周赛的难题想要独立做出来还是有一定难度的&#xff0c;需要消耗大量时间 比赛地址 3011. 判断一个数组是否可以变为有序 public class Solution {public int minimumCost(int[] nums) {if (nums.length < 3) {// 数组长度小于3时&a…

UG制图-创建图纸的多种方法

1、2D&#xff1a;创建独立2D图纸&#xff0c;不引用任何3D模型 在UG软件中选择新建&#xff0c;或者快捷键ctrl N&#xff0c;进入新建命令&#xff0c;然后点击图纸&#xff0c;在关系中选择独立的部件&#xff0c;就创建了一个独立的图纸&#xff0c;我们可以在装配中添加…

项目管理该考哪个证书❓NPDP还是软考❓

有小伙伴在纠结是要考NPDP认证呢还是考软考呢❓ 今天小编要给大家好好说说NPDP认证❗️ &#x1f4a1;NPDP全称New Product Development Professional&#xff0c;也就是产品经理国际资格认证。 &#x1f525;NPDP是国际公认的为一的新产品开发专业认证&#xff0c;是集理论、方…

「环境配置」使用Windows自带工具清理C盘空间

​ Windows电脑操作系统一般是安装在磁盘驱动器的C盘中&#xff0c;一旦运行&#xff0c;便会产生许多垃圾文件&#xff0c;C盘空间在一定程度上都会越来越小。伴随着电脑工作的时间越久&#xff0c;C盘常常会提示显示其内存已不足。本文记录笔者清理机器的步骤。 一、使用Win…

在Qt中通过控制按钮实现登录界面密码与明码的转换

创建控件&#xff1a; 首先&#xff0c;在Qt设计师界面界面上创建QLineEdit类文本框&#xff0c;用于输入密码&#xff0c;并且实现密码与明码相互转化。 设置初始状态&#xff1a; 默认情况下&#xff0c;输入密码的文本框应该是可见的并允许用户输入。 添加切换按钮&…

【Oracle】收集Oracle数据库内存相关的信息

文章目录 【Oracle】收集Oracle数据库内存相关的信息收集Oracle数据库内存命令例各命令的解释输出结果例参考 【声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 【Oracle】收集Oracle数据库内存相关的信息 …

【Elasticsearch】索引恢复(recovery)流程梳理之副本分片数据恢复

replica shard重启具体流程 replica shard node &#xff08;generic threadpool&#xff09; 也是因为应用新的集群状态触发recovery&#xff0c;进入index阶段进入translog 阶段。先尝试重放本地的translog到global checkpoint向primary shard发起start recovery的请求&…

用户ssh正确密码登陆树莓派镜像均报错Permission denied, please try again.处理方法

一个树莓派镜像&#xff0c;启动后发现没有 sshd 功能&#xff0c;于是 启用 openssh&#xff0c;重新启动&#xff0c;又发现树莓派拒绝 ssh 连接请求。 我的一台树莓派IP是&#xff1a;192.168.59.133任何服务器使用任何用户ssh均报错&#xff0c;甚至连自己都不能ssh自己。 …