C#异常和异常处理

C# 语言的异常处理功能有助于处理在程序运行期间发生的任何意外或异常情况。 异常处理功能使用 trycatch 和 finally 关键字来尝试执行可能失败的操作、在你确定合理的情况下处理故障,以及在事后清除资源。 公共语言运行时 (CLR)、.NET/第三方库或应用程序代码都可生成异常。 异常是使用 throw 关键字创建而成。

 

public class MyException

    {

        public static double divs(double a,double b)

        {

            if (b==0)

            {

                //抛出除数为0的异常

                throw new DivideByZeroException();

            }



            return a / b;

        }

}



 static void Main(string[] args)

        {



            //捕获异常: 若不捕获异常,程序将直接崩溃

            try

            {

                double result=MyException.divs(6, 0);

                Console.WriteLine(result);

            }

            catch (DivideByZeroException)

            {

                Console.WriteLine("除数不能为0");

            }



            Console.ReadLine();

        }

异常概述

异常具有以下属性:

  • 异常是最终全都派生自 System.Exception 的类型。
  • 在可能抛出异常的语句周围使用 try 代码块。
  • 在 try 代码块中出现异常后,控制流会跳转到调用堆栈中任意位置上的首个相关异常处理程序。 在 C# 中,catch 关键字用于定义异常处理程序。
  • 如果给定的异常没有对应的异常处理程序,那么程序会停止执行,并显示错误消息。
  • 除非可以处理异常并让应用程序一直处于已知状态,否则不捕获异常。 如果捕获 System.Exception,使用 catch 代码块末尾的 throw 关键字重新抛出异常。
  • 如果 catch 代码块定义异常变量,可以用它来详细了解所发生的异常类型。
  • 使用 throw 关键字,程序可以显式生成异常。
  • 异常对象包含错误详细信息,如调用堆栈的状态和错误的文本说明。
  • 即使引发异常,finally 代码块中的代码仍会执行。 使用 finally 代码块可释放资源。例如,关闭在 try 代码块中打开的任何流或文件。
  • .NET 中的托管异常在 Win32 结构化异常处理机制的基础之上实现。

//捕获系统提供的异常

 public class MyException

    {

        public static double divs(double a,double b)

        {

            if (b==0)

            {

                //抛出除数为0的异常

                throw new DivideByZeroException();

            }



            return a / b;

        }

}







 //自定义异常

    class CustomException:Exception

    {

        public CustomException(string mes) { }

    }



    

    public class ExceptionTest

    {

        public void etest()

        {

            //抛出自定义的异常

            throw new CustomException("这是一个自定义的错误!");

        }

    }







        static void Main(string[] args)

        {



            //捕获异常: 若不捕获异常,程序将直接崩溃

            try

            {

                //里面包含系统异常

                double result=MyException.divs(6, 0);

                Console.WriteLine(result);



                //里面包含自定义异常

                ExceptionTest et = new ExceptionTest();

                et.etest();



            }

            //捕获系统已有异常

            catch (DivideByZeroException)

            {

                Console.WriteLine("除数不能为0");

            }

            //捕获自定义异常

            catch (CustomException ct)

            {

                Console.WriteLine(ct.Message); //打印异常信息

            }

            //finally 块可用于发布资源(如文件流、数据库连接和图形句柄)而无需等待运行时中的垃圾回收器来完成对象。

            finally

            {

                Console.WriteLine("最终执行,一般用于回收或释放资源!");

            }







            Console.ReadLine();

        }

编译器生成的异常

当基本操作失败时,.NET 运行时会自动引发一些异常。 这些异常及其错误条件在下表中列出。

例外

描述

ArithmeticException

算术运算期间出现的异常的基类,例如 DivideByZeroException 和 OverflowException

ArrayTypeMismatchException

由于元素的实际类型与数组的实际类型不兼容而导致数组无法存储给定元素时引发。

DivideByZeroException

尝试将整数值除以零时引发。

IndexOutOfRangeException

索引小于零或超出数组边界时,尝试对数组编制索引时引发。

InvalidCastException

从基类型显式转换为接口或派生类型在运行时失败时引发。

NullReferenceException

尝试引用值为 null 的对象时引发。

OutOfMemoryException

尝试使用运算符分配内存失败时引发。 此异常表示可用于公共语言运行时的内存已用尽。

OverflowException

checked 上下文中的算术运算溢出时引发。

StackOverflowException

执行堆栈由于有过多挂起的方法调用而用尽时引发;通常表示非常深的递归或无限递归。

TypeInitializationException

静态构造函数引发异常并且没有兼容的 catch 子句来捕获异常时引发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code_shenbing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值