Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 475|回复: 0

【又长见识了】C#异常处理,try、catch、finally、throw

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-20 11:13:00 | 显示全部楼层 |阅读模式

      

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

      1、轻描淡写Try、Catch、Finally、throw用法

      在异常处理中,首先需要对可能发生异常的语句进行异常捕捉,try就是用于预测可能出现的异常。捕获异常并对异常进行处理,就在catch中实现。不管异常发生与否,都会执行finally里面的语句。先看一个例子:  

            static void Main(string[] args)
            {
                Console.WriteLine("请输入除数:");
                int num1 =int.Parse ( Console.ReadLine());
                Console.WriteLine("请输入被除数:");
                int num2 = int.Parse(Console .ReadLine ());
                int res = 0;
                try
                {
                    Console.WriteLine("异常前…………………………");
                    res = num1 / num2;
                    Console.WriteLine("无异常…………………………");
                    Console.WriteLine("{0}除以{1}等于:{2}", num1, num2, res);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("出现异常了!!!!!!!!");
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    Console.WriteLine();
                    Console.WriteLine("计算结束!");
                }
                
                Console.Read();
    
            }

      如上例所示,两个数相除,特别是用户输入的时候不可控,很可能存在除数为零的异常,把它们放在try语句中。当执行到try语句中,出现异常立即退出try语句(意味着出现了异常,异常以前的语句要执行,异常后的语句就不执行了),然后执行catch中的语句。不管异常出现与否,都要执行finally里的语句。其实最后一句不放在finally里面,还是不管异常发生与否都会执行啊,那finally有什么作用呢?先埋一个伏笔。throw则用于抛出异常,把异常返回给程序,出了异常,当然程序就会中断啦,会抛出异常。

     

      再看一个例子:try和catch中存在retrun的情况

            static int Division(int num1, int num2, out int res)
            {
                int times = 0;
                try
                {
                    res = num1 / num2;
                    return times;
                }
                catch (Exception ex)
                {

                      res = 0;
                      return times--;

                }
                finally
                {
                    times++;
                }
    
            }
                int res;
    // int times = Division(20, 0, out res);
    int times = Division(20, 10, out res); Console.WriteLine(res);//输出结果为2 Console.WriteLine(times);//times????


      因为不管发生异常与否都会执行finally里面的语句,那times应该是1。但结果两种情况下都是0。这是什么原因,这是因为在try中return了。用反编译的方式,我们可以看到,其实在try或者catch中return,相当于在声明了一个变量,把要return的值赋给变量,最后再在finally之后(其实是整个函数运行到最后)才返回这个变量,所以原来return回去的值是没有改变的。即使不写把times++写在finally之中,就写在后面,返回结果还是一样的。   (所以上面这个函数就不能这么写拉,我是故意错的哟,嘻嘻哈哈!!!)

      finnally中还是执行了times++的。

      但如果是引用类型的话,由于传递的是地址,把地址赋给一个变量最后返回地址,返回的结果就看这个地址指向的内容的变化了。既然有缘看到这篇文章,自己试一下吧!(嘿嘿)

      又有一个疑问了,那finally有啥用???

      2、自定义异常

      一个try可以捕获多个异常,try和catch中都能再嵌套try和catch,如下:

              try
                {
                    try
                    {
    
                    }
                    catch (Exception)
                    {
                        
                        throw;
                    }
    
                }
                catch (DivideByZeroException de)
                {
                    try
                    {
    
                    }
                    catch (Exception)
                    {
                        
                        throw;
                    }
    
                }
                catch (OverflowException oe)
                {
    
                }
                catch (Exception ex)
                {
    
                }
                finally
                {
     
                }
    Try_Catch_Finally

        这些异常都继承自Exception,所以也可以自定义异常。定义一个类继承自Exception就行了。如下:

     class MyException:Exception 
        {
            public MyException():base()
            {
     
            }
            public MyException(string msg):base( msg)
            {
                msg = "自定义异常";
            }
        }
    自定义异常
              try
                {
                    throw new  MyException();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message );//输出引发类型为“Try_Catch_Finally.MyEexception”的异常
                    
                }

      一个try中可以有多个catch,但是只能有一个finally;try至少要有catch或者finally,不能单独try;try ,catch,finally中可以均嵌套try_catch_finally;

      Finally:

      Finally,主要用于异常安全,当try中没有catch的时候,只能在finally中释放上一级资源。

      using 的用法,就是最后自动dispose,它内部的原理就是利用了try-finally,在finally中dispose;

         Using:

      顺便说一下using的用法,使用using可以在using作用域结束后自动释放资源(dispose),要使用using,类必须继承了Idispose方法才行。

     

     

      暂时先总结于此,边学边用再边补充  .. 。。o o 0 

      

      

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 07:32 , Processed in 0.061570 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表