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

2024-01-21 11:20

本文主要是介绍常见异常类及异常对象属性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  程序运行的过程中,会发生各种非正常状况,比如程序运行时磁盘空间不足,网络连接中断,被操作的文件不存在。(异常在程序运行时发生)
  针对这种情况下,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.chinasem.cn/article/629358

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex