C#异常处理知识汇总

概念

异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常

但并不是所有的错误都是异常

而处理这种错误,称为异常处理

异常处理实际是不断去发掘异常、修改异常,使程序更稳定

异常处理主要表现在四个方面:

1 程序开发前:尽可能的想到会发生的错误,标注怎么处理应对

2 程序开发中:尽量暴露程序的问题,解决这些可能的异常 

3 系统发布后:尽可能的解决隐藏的或测试人员未测试到的程序问题  

4 发生异常时:异常代码转化成了友好提示显示给用户

异常分类 

编译错误

1 大小写混淆

2 数据类型与变量类型不符

3 使用未声明的变量

运行错误  

1 数组下标越界  

2 除数为零

3 其他运行错误

逻辑错误   

1 超出数据类型的取值范围 

2 语句体忘记加大括号  

3 其他逻辑性错误

异常处理操作

C#中异常处理时建立在四个关键词之上:try、catch、finally 和 throw。

try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块 

catch:程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获 

finally:用于执行给定的语句,不管异常是否被抛出都会执行 

throw:当问题出现时,程序抛出一个异常。使用 throw 关键字来完成

异常语句格式

try

{

// 引起异常的语句

}

catch( ExceptionName e )

{

// 错误处理代码

}

finally

{

// 要执行的语句

}

示例

using System;
namespace DivisorIsZero
{
  public class DivisorIsZero
  {
    private static void Main()
    {
      int div0 = 20;
      int div1 = 0;
      int div2 = 2;
      int DivValue;

      try
      {
        DivValue = div0 / div1;
        System.Console.WriteLine("div0 / div1 = {0}", DivValue);
      }
      catch(DivideByZeroException e )
      {
        System.Console.WriteLine("零不能作为除数!异常值为:\n{0}",e);
      }

      // catch(DivideByZeroException e)子句只能捕获特定的异常
      // try内的程序代码可能还会产生其它的异常,这些异常只能由catch(Exception e)来捕获了
      catch(Exception e )
      {
        System.Console.WriteLine("并非\''零作为除数引发的异常\"!异常值为:\n{0}",e);
      }
      finally
      {
        System.Console.WriteLine("无论是否发生异常,我都会显示");
        System.Console.ReadKey();
      }
    }
  }
}

结果

C#中常见的异常类

C# 异常是使用类来表示的

C# 中的异常类主要是直接或间接地派生于 System.Exception 类System.ApplicationException 和System.SystemException 类是派生于 System.Exception 类的异常类

System.ApplicationException 类支持由应用程序生成的异常。所以程序员定义的异常都应派生自该类 

System.SystemException 类是所有预定义的系统异常的基类

由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 挂起的方法调用过多而导致执行堆栈溢出时引发的异常

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

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

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

System.DivideByZeroException 试图用零除整数值或十进制数值时引发的异常 

System.NotFiniteNumberException 当浮点值为正无穷大、负无穷大或非数字(NaN)时引发的异常

System.OverflowException 在选中的上下文中所进行的算数运算、类型转换或转换操作导致溢出时引发的异常

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

System.IO.DirectoryNotFoundException 当找不到文件或目录的一部分时所引发的异常

System.IO.DriveNotFoundException 当尝试访问的驱动器或共享不可用时引发的异常

System.IO.EndOfStreamException 读操作试图超出流的末尾时引发的异常

System.IO.FileLoadException 当找到托管程序却不能加载它时引发的异常

System.IO.FileNotFoundException 试图访问磁盘上不存在的文件失败时引发的异常

System.IO.PathTooLongException 当路径名或文件名超过系统定义的最大长度时引发的异常

其他常用异常类型:  

ArrayTypeMismatchException 试图在数组中存储错误类型的对象

BadImageFormatException 图形的格式错误

DivideByZeroException 除零异常  

DllNotFoundException 找不到引用的dll

FormatException 参数格式错误

MethodAccessException 试图访问私有或者受保护的方法

MissingMemberException 访问一个无效版本的dll

NotSupportedException 调用的方法在类中没有实现

PlatformNotSupportedException 平台不支持某个特定属性时抛出该错误

以上就是C#异常处理知识汇总的详细内容,更多关于C#异常处理的资料请关注我们其它相关文章!

(0)

相关推荐

  • 浅谈C#中简单的异常引发与处理操作

    异常和异常处理 C# 语言的异常处理功能可帮助您处理程序运行时出现的任何意外或异常情况.异常处理使用 try.catch 和 finally 关键字尝试某些操作,以处理失败情况,尽管这些操作有可能失败,但如果您确定需要这样做,且希望在事后清理资源,就可以尝试这样做.公共语言运行时 (CLR)..NET Framework 或任何第三方库或者应用程序代码都可以生成异常.异常是使用 throw 关键字创建的. 很多情况下,异常可能不是由代码直接调用的方法引发,而是由调用堆栈中位置更靠下的另一个方法所

  • C#异常处理中try和catch语句及finally语句的用法示例

    使用 try/catch 处理异常 try-catch 块的用途是捕捉和处理工作代码所生成的异常. 有些异常可以在 catch 块中处理,解决问题后不会再次引发异常:但更多情况下,您唯一能做的是确保引发适当的异常. 示例 在此示例中,IndexOutOfRangeException 不是最适当的异常:对本方法而言 ArgumentOutOfRangeException 更恰当些,因为错误是由调用方传入的 index 参数导致的. class TestTryCatch { static int G

  • C#异常处理详解

    异常介绍 1.System.Exception类 Message属性:发生异常的原因和异常的内容 Souce属性:抛出异常程序集的名称 StackTrace属性:发生异常的方法调用情况 InnerException属性:次异常中包含的异常 2.try{}catch{}finally{} 处理异常 a.不带参数的catch和catch(Exception)是有区别的 catch(Exception)可以捕获所有以Exception类派生的异常,而不带参数的catch可以捕获所有异常,不管异常是不是

  • C# WinForm捕获未处理的异常实例解析

    本文以一个完整的实例形式讲述了C# WinForm捕获未处理的异常的方法.分享给大家供大家参考之用.具体代码如下: using System; using System.Collections.Generic; using System.Windows.Forms; using System.IO; namespace GobalException { static class Program { /// <summary> /// 应用程序的主入口点. /// </summary>

  • C#异常处理知识汇总

    概念 异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常 但并不是所有的错误都是异常 而处理这种错误,称为异常处理 异常处理实际是不断去发掘异常.修改异常,使程序更稳定 异常处理主要表现在四个方面: 1 程序开发前:尽可能的想到会发生的错误,标注怎么处理应对 2 程序开发中:尽量暴露程序的问题,解决这些可能的异常 3 系统发布后:尽可能的解决隐藏的或测试人员未测试到的程序问题 4 发生异常时:异常代码转化成了友好提示显示给用户 异常分类 编译错误 1 大小写混淆 2 数据

  • Java基础知识汇总

    Java基础知识 1.Java语言的优点: 1)Java是纯面向对象语言 2)与平台无关性,一次编译到处运行 3)Java提供了狠多内置类库 4)提供了对web应用的支持 5)具有较好的安全性(数组边界检测.Bytecode检测)和健壮性(强制型机制.垃圾回收器.异常处理) 6)去除c++难以理解的一些特性(头文件 指针 运算符重载 多重继承) 2.java与c++的异同: 1)Java为解释型语言,c++为编译型语言,java会慢但是跨平台 2)Jave为纯面向对象,c++既面向对象又能面向过

  • PHP错误机制知识汇总

    PHP的错误机制也是非常复杂的,做了几年php,也没有仔细总结过,现在就补上这一课. 特别说明:文章的PHP版本使用5.5.32 PHP的错误级别 首先需要了解php有哪些错误.截至到php5.5,一共有16个错误级别 注意:尝试下面的代码的时候请确保打开error_log: error_reporting(E_ALL); ini_set('display_errors', 'On'); E_ERROR 这种错误是致命错误,会在页面显示Fatal Error, 当出现这种错误的时候,程序就无法继

  • Python对文件操作知识汇总

    打开文件 操作文件 1打开文件时,需要指定文件路径和打开方式 打开方式: r:只读 w:只写 a:追加 "+"表示可以同时读写某个文件 r+:读写 w+:写读 a+:同a U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用) rU r+U "b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注) rb wb ab f = open('test.log',

  • Python时间获取及转换知识汇总

    时间处理是我们日常开发中最最常见的需求,例如:获取当前datetime.获取当天date.获取明天/前N天.获取当天开始和结束时间(00:00:00 23:59:59).获取两个datetime的时间差.获取本周/本月/上月最后一天等.而这些转换看起来很乱不容易记住,那么今天我们就来总结一下Python的时间的处理. 原则:以datetime为中心, 起点或中转, 转化为目标对象, 涵盖了大多数业务场景中需要的日期转换处理 步骤: 1. 掌握几种对象及其关系 2. 了解每类对象的基本操作方法 3

  • spring boot 全局异常处理方法汇总

    这篇文章主要介绍了spring boot 全局异常处理方法汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 import cn.sisyphe.framework.web.exception.DataException; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.co

  • 学习Python列表的基础知识汇总

    千里之行,始于足下.要练成一双洞悉一切的眼睛,还是得先把基本功扎扎实实地学好.今天,本喵带大家仔细温习一下Python的列表.温故而知新,不亦说乎. 当然,温习的同时也要发散思考,因为有些看似无关紧要的.约定俗成的语言习惯,例如数组索引为何从0开始,其背后可能大有来历.知其然,亦需知其所以然啊喵喵喵~~~ 最后,在基础知识之上,更要探索进阶,例如学习生成器表达式,这样既能更扎实地掌握基础,又能融会贯通,获得更全面的认知升级. Python的列表是怎样滴? 列表(list)是一种有序的集合,可以随

  • JAVA内存空间相关知识汇总

    Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识.一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 ◆堆:存放用new产生的数据 ◆静态域:存放在对象中用static定义的静态成员 ◆常量池:存放常量 ◆非RAM存储:硬盘等永久存储空间 Java内存

  • JAVA 枚举相关知识汇总

    Java 枚举 知识点 概念 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性. 在Java中,被 enum 关键字修饰的类型就是枚举类型.形式如下: enum Color { RED, GREEN, BLUE } 如果枚举不添加任何方法,枚举值默认为从0开始的有序数值.以 Color 枚举类型举例,它的枚举常量依次为 RED:0,GREEN:1,BLUE:2. 枚举的好处:可以将常量组织起来,统一进行管理. 枚举的典型应用场景:错误码.状态机等. 枚举类型的本质

  • JAVA 线程通信相关知识汇总

    两个线程之间的通信 多线程环境下CPU会随机的在线程之间进行切换,如果想让两个线程有规律的去执行,那就需要两个线程之间进行通信,在Object类中的两个方法wait和notify可以实现通信. wait方法可以使当前线程进入到等待状态,在没有被唤醒的情况下,线程会一直保持等待状态. notify方法可以随机唤醒单个在等待状态下的线程. 来实现这样的一个功能: 让两个线程交替在控制台输出一行文字 定义一个Print类,有两个方法print1和print2,分别打印一行不同的内容 package c

随机推荐