zoukankan      html  css  js  c++  java
  • C#的异常处理机制 (转载)

    今天学习了C#的异常处理机制,现将所学总结如下:

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

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

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

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

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

        二、C#异常处理的格式

    try

    {

      程序代码块;

    }

    catchException e

    {

       异常处理代码块;

    }

    finally

    {

       无论是否发生异常,均要执行的代码块;

    }

      

        三、异常处理实战

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

    public class DivisorIsZero

    {

    private static void Main()

    {

    int dividend=10;

    int divisor1=0;

    int divisor2=5;

    int DivideValue;

    try

    {

    DivideValue=dividend/divisor1;  //(1)

    //DivideValue=dividend/divisor2; //(2)

    System.Console.WriteLine("DivideValue={0}",DivideValue);//3)这一行将不会被执行。

    }

    catch

    {

    System.Console.WriteLine("传递过来的异常值为:{0}",e);

    }

    finally

    {

    System.Console.WriteLine("无论是否发生异常,我都会显示。");

    }

    }

    }

     

         注:(1)行被执行则会抛出一个异常,如果没有catch语句,程序会异常终止,使用不带参数的catch子句,则可以捕获任意类型的异常。

       如果将(1)行注释掉,启用(2)行,这意味该程序运行时不会出现异常,从输出可知,finally代码块仍将被执行。

     

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

    catch(DivideByZeroException e)

    {

        System.Console.WriteLine("零不能作为除数!异常值为:\n{0}",e);

    }

    catch(Exception e)

    {

        System.Console.WriteLine("并非\''零作为除数引发的异常\"!异常值为:\n{0}",e);

    }

        为什么还要加上一个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)

     

        看一个例子:

    class IAmSecondGrade:System.Exception{}//声明异常

     

    class SecondGrade

    {

    public static int mul(int first,int second)

    {

    if(first>100||second>100)

    throw new IAmSecondGrade();//引发异常

    return (first*second);

    }

     

    public static void Main()

    {

    int mul_value;

    try

    {

    mul_value=mul(99,56);

    System.Console.WriteLine("99与56积为:{0}",mul_value);

    mul_value=mul(101,4);

    System.Console.WriteLine("出现异常,这行是不会被执行的。");

    }

    catch(IAmSecondGrade)//捕获自定义的异常

    {

    System.Console.WriteLine("我才上二年级,超过100的乘法我不会。嘿嘿,我自定义的异常。");

    }

    catch(System.Exception e)

    {

    System.Console.WriteLine("非自定义异常。其值为:{0}",e);

    }

     

    }

    }

  • 相关阅读:
    java 在线网络考试系统源码 springboot mybaits vue.js 前后分离跨域
    springboot 整合flowable 项目源码 mybiats vue.js 前后分离 跨域
    flowable Springboot vue.js 前后分离 跨域 有代码生成器 工作流
    Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器
    java 企业 网站源码 后台 springmvc SSM 前台 静态化 代码生成器
    java 进销存 商户管理 系统 管理 库存管理 销售报表springmvc SSM项目
    基于FPGA的电子计算器设计(中)
    基于FPGA的电子计算器设计(上)
    FPGA零基础学习:SPI 协议驱动设计
    Signal tap 逻辑分析仪使用教程
  • 原文地址:https://www.cnblogs.com/silva/p/222496.html
Copyright © 2011-2022 走看看