C#中的异常捕获机制(try catch finally)

一、C#的异常处理所用到关键字

try :用于检查发生的异常,并帮助发送任何可能的异常。

catch :以控制权更大的方式处理错误,可以有多个catch子句。

 finally: 无论是否引发了异常,finally的代码块都将被执行。

 throw: 用于引发异常,可引发预定义异常和自定义异常。

二、C#异常处理的格式

 1    try
 2      {
 3            //程序代码块;
 4     }
 5 catch(Exception e)
 6    {
 7         //异常处理代码块;
 8    }
 9  finally
10  {
11      //无论是否发生异常,均要执行的代码块;
12  }

三、异常处理实战

一个除数和零的简单例子:

 1 public class DivisorIsZero
 2 {
 3      private static void Main()
 4 {
 5 int dividend=10;
 6 int divisor1=0;
 7 int divisor2=5;
 8 int DivideValue;
 9
10 try
11 {
12     DivideValue=dividend/divisor1; //(1)
13     //DivideValue=dividend/divisor2; //(2)
14     System.Console.WriteLine("DivideValue={0}",DivideValue);//(3)这一行将不会被执行。
15 }
16 catch
17 {
18      System.Console.WriteLine("传递过来的异常值为:{0}",e);
19 }
20 finally
21 {
22         System.Console.WriteLine("无论是否发生异常,我都会显示。");
23 }
24 }
25 }

注:(1)行被执行则会抛出一个异常,如果没有catch语句,程序会异常终止,使用不带参数的catch子句,则可以捕获任意类型的异常。
如果将(1)行注释掉,启用(2)行,这意味该程序运行时不会出现异常,从输出可知,finally代码块仍将被执行。

可以给try语句提供多个catch语句,以捕获特定的异常,如上例中:0作为除数则会引发DivideByZeroException类型的异常,上例中的catch语句可以作如下修改:

1 catch(DivideByZeroException e)
2 {
3      System.Console.WriteLine("零不能作为除数!异常值为:\n{0}",e);
4 }
5 catch(Exception e)
6 {
7     System.Console.WriteLine("并非\‘‘零作为除数引发的异常\"!异常值为:\n{0}",e);
8 }

为什么还要加上一个catch(Exception e)子句呢?原因很简单,catch(DivideByZeroException e)子句只能捕获特定的异常,try内的程序代码可能还会产生其它的异常,这些异常只能由catch(Exception e)来捕获了。

下表给出了一些常见的异常:

System名称空间中常用的异常类

异常类名称 简单描述

MemberAccessException 访问错误:类型成员不能被访问

ArgumentException 参数错误:方法的参数无效

ArgumentNullException 参数为空:给方法传递一个不可接受的空参数

ArithmeticException 数学计算错误:由于数学运算导致的异常,覆盖面广。

ArrayTypeMismatchException 数组类型不匹配

DivideByZeroException 被零除

FormatException 参数的格式不正确

IndexOutOfRangeException 索引超出范围,小于0或比最后一个元素的索引还大

InvalidCastException 非法强制转换,在显式转换失败时引发

MulticastNotSupportedException 不支持的组播:组合两个非空委派失败时引发

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

NullReferenceException 引用空引用对象时引发

OutOfMemoryException 无法为新语句分配内存时引发,内存不足

OverflowException 溢出

StackOverflowException 栈溢出

TypeInitializationException 错误的初始化类型:静态构造函数有问题时引发

NotFiniteNumberException 无限大的值:数字不合法

四、定义自己的异常类

除了预定义的异常外,我们还可以创建自己的异常,过程比较简单:

一声明一个异常,格式如下:

class ExceptionName:Exception{}

二引发自己的异常:

throw(ExceptionName);

看一个例子:

 1 class IAmSecondGrade:System.Exception{}//声明异常
 2
 3 class SecondGrade
 4 {
 5 public static int mul(int first,int second)
 6 {
 7 if(first>100||second>100)
 8 throw new IAmSecondGrade();//引发异常
 9 return (first*second);
10 }
11
12 public static void Main()
13 {
14 int mul_value;
15
16 try
17 {
18     mul_value=mul(99,56);
19     System.Console.WriteLine("99与56积为:{0}",mul_value);
20     mul_value=mul(101,4);
21     System.Console.WriteLine("出现异常,这行是不会被执行的。");
22 }
23 catch(IAmSecondGrade)//捕获自定义的异常
24 {
25     System.Console.WriteLine("我才上二年级,超过100的乘法我不会。嘿嘿,我自定义的异常。");
26 }
27 catch(System.Exception e)
28 {
29     System.Console.WriteLine("非自定义异常。其值为:{0}",e);
30 }
31 }
32 }
时间: 2024-10-17 19:46:42

C#中的异常捕获机制(try catch finally)的相关文章

异常捕获机制

在写代码的时候最怕代码写了几百上千行,可是一运行程序就崩溃:为了提高代码的健壮性,下面提供一种提高代码健壮性的方式: 异常捕获机制 1 // 异常捕获机制:提高代码的健壮性 2 @try---@catch---@finally 下面以一个打印数组的小Demo说明其用法 1 NSArray *arr = @[@10, @20, @30]; 2 @try { 3 /* 将有可能出问题导致程序崩溃的代码放在try语句体中 */ 4 NSLog(@"arr[3] = %@",arr[3]);

用c实现跨平台异常捕获机制

TBOX封装了一套跨平台的异常捕获实现,来模拟windows的seh异常处理功能,而且是线程安全的. 在linux/mac下的实现 使用signal 捕获异常信号 使用sigsetjmp保存现场寄存器和信号掩码,出现异常后使用 siglongjmp 跳转到异常处理过程,并恢复状态 使用线程局部存储维护 sigjmpbuf 寄存器现场状态堆栈,保证多线程安全,并且可以实现多层嵌套捕获处理. 在windows下的实现 这个就不用多说了,在vs下直接用 try.except 关键字就行了,如果在min

C#基础知识点之try catch 异常捕获机制

一.C#的异常处理所用到关键字 try 用于检查发生的异常,并帮助发送任何可能的异常. catch 以控制权更大的方式处理错误,可以有多个catch子句. finally 无论是否引发了异常,finally的代码块都将被执行. throw 用于引发异常,可引发预定义异常和自定义异常. 二.C#异常处理的格式 try { 程序代码块: } catch(Exception e) { 异常处理代码块: } finally { 无论是否发生异常,均要执行的代码块: } 三.异常处理实战 一个除数和零的简

.net mvc中AOP 异常捕获后返回自定义的Json

.net mvc中封装了一些特性可以实现AOP,如常用的HandleErrorAttribute,ActionFilterAttribute,AuthorizeAttribute.自定义一个特性,继承这些特性,并重写里面的方法就可以AOP切入到Action中的关注点.本篇文章主要对笔者在使用HandleErrorAttribute的过程中遇到的一个问题进行分享. 我们在action中会用try..catch..进行异常处理,笔者在catch中返回一个json(标示失败).我发现所有的action

js中的异常捕获 try{} catch{}(二)

事件轮循中,抛出的异常信息会丢失函数调用的路径,所以每一步都要进行错误处理 function a(){ b(); } function b(){ c(); } function c(){ // setTimeout(() => { // throw new Error('here'); // }, 1000); throw new Error('here'); } //调用a方法 a(); 异步函数抛出错误信息显示: 同步方法抛出错误信息显示: 原文地址:https://www.cnblogs.

JAVA 线程中的异常捕获

在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked exception处理掉.这一点是通过java.lang.Runnable.run()方法声明(因为此方法声明上没有throw exception部分)进行了约束.但是线程依然有可能抛出unchecked exception(如运行时异常),当此类异常跑抛出时,线程就会终结,而对于主线程和其他线程完全

python中的异常捕获怎么用?

http://www.2cto.com/kf/201301/184121.html http://www.w3cschool.cc/python/python-exceptions.html try: a=b b=c except Exception,e:   #except后面加异常种类 print Exception,":",e try: a=b b=c except Exception,e: print Exception,":",e

T-SQL编程中的异常处理-异常捕获(try catch)与抛出异常(throw)

原文:T-SQL编程中的异常处理-异常捕获(try catch)与抛出异常(throw) 本文出处: http://www.cnblogs.com/wy123/p/6743515.html T-SQL编程与应用程序一样,都有异常处理机制,比如异常的捕获与异常的抛出(try catch throw),本文简单介绍异常捕获与异常抛出在T-SQL编程中的实际使用 . 异常处理简单说明 异常捕获在应用程序编程中非常常见,提供了处理程序运行时出现的任何意外或异常情况的方法刚毕业的时候对于异常处理迷茫不解,

swift 异常捕获try catch的使用

新的异常捕获机制更新于 WWDC 2015上发布的新的Swift2.0,异常的try-catch机制有助于我们更快的定位出错原因所在,此处简单说明下try-catch机制的用法. 1.定义枚举异常值 首先我们可以创建自己的异常枚举值,这要实现ErrorType协议,只不过这个协议是空的,我们加上就好. 2.抛出异常 我们可以在方法中抛出异常,定义抛出异常的方法很简单,只需要在返回值的 -> 前面加上throws就好了,示例如下:(这个方法是自定义的Dog类里的一个实例方法,name.length