则CLCR-V会查看调用当前艺术的章程

介绍

任由是新手可能工作几年的老油条,对try{}catch{}来讲是不不熟悉的。他得以来支援大家获得异常音讯,在try中的代码现身谬误,火灾catch代码块中被捕获到。官方也给了详尽的演讲:。

抛出极其时,公共语言运营库(CLLacrosse卡塔尔国会招来catch拍卖此丰裕的语句。假若当前正值实践的点子不分包那样的catch块,则CL冠道会查看调用当前方式的措施,依此类推调用旅馆。假使未catch找到任何块,则CL宝马X5向客商体现未管理的充裕消息并终止施行该程序。

如上的那一个基本功大家大概都理解。不过你确实掌握他的运转步骤吗?作者正是带着这么些问号举办了一下的多少个测量检验。

归纳示例:

既然如此有了疑义就带着难点想艺术验证吧,上边我们透过多少个例子来一步一步的深入分析拿到大家想要的结果。

简单的try catch

第一是二个try中绝非这多少个的演示:

 static void Main(string[] args)
        {
            string result =GetStr();
            Console.WriteLine(result);
            Console.ReadLine();
        }
        public static string GetStr()
        {
            try
            {
                Console.WriteLine("走到:try");
                return "这里是try返回值";
            }
            catch (Exception e)
            {
                Console.WriteLine("走到:catch");
                return "这里是catch返回值";
            }
            finally
            {
                Console.WriteLine("走到:finally");
            }
            return "这里是方法底部返回值";
        }

运营结果:

图片 1

施行剖析:

这是最简便易行最普及的亲自过问,未有发出极度,然后未有走catch,推行各种是try=>finally=>return;

全部我们收获三个还不明确的结果在GetStr方法中不会举办措施自身的return;

只是finally方法块都会进行;

来个十一分的:

上边大家让try方法块出错就好了,然后大家改革一下代码如下:

 public static string GetStr()
        {
            try
            {
                int value = 0;
                Console.WriteLine("走到:try");
                var i = 1 / value;//这里会出错 0不能被整除
                return "这里是try返回值";
            }
            catch (Exception e)
            {
                Console.WriteLine("走到:catch");
                return "这里是catch返回值";
            }
            finally
            {
                Console.WriteLine("走到:finally");
            }
            return "这里是方法底部返回值";
        }

运转结果:

图片 2

进行深入分析:

此地在try发生了非常,然后未有健康重回,步向到了catch方法块:try=>catch=>finally=>return;

那边大家得以鲜明:

  • 不管try有没有出错finally方法块都会被试行。【快记笔记,知识点。】
  • 正是try和catch方法都有return,finally都会实行;
  • 只要try或者catch return返回,try catch 之外的return都无效;

聊到此处有些不驾驭人恐怕会有疑难?那在finally写个return是何等结果哪?非常不好的告诉你,无法这么写,写了会怎么样,哼会提醒:调整不能离开finally子句主体;

验证return的值

上面我们了然了怎么样都会实施finally,然而进行了finally对大家的正重回值有未有印象哪,比如小编在try里面前蒙受叁个变量赋值为a字符串,举办了归来,不过在finally里面改善成了b字符串。会不会被校勘哪?

大家依然老代码,然后改良成我们想的范例:

public static string GetStr()
        {
            string str = "";
            try
            {
                str = "修改成了a";
                Console.WriteLine("走到:try");
                // return "这里是try返回值";
                return str;
            }
            catch (Exception e)
            {
                Console.WriteLine("走到:catch");
                return "这里是catch返回值";
            }
            finally
            {
                str = "修改成了b";
                Console.WriteLine("走到:finally");
            }
            return "这里是方法底部返回值";
        }

运营结果:

图片 3

推行分析:

未有极度可能老样子:试行顺序是try=>finally=>return;

只是大家在finally改正了str字符串,可是通过输出结果我们获得的仍然a字符串,

享有大家获得结论:即使finally方法会被实行不过,重回结果不会被改革,也便是假使finally是在return其后试行的那么他会把重返结果先保存起来,然后不管finally代码执行了哪些,都不会潜濡默化到重返结果,等finally实践到位在重返结果。

 两个重复try

那么大家得以写多个try{}try{}这样的言辞吗?不行,会直接报错,其实这么写未有其他意义。

八个再一次catch

那么重复四个catch哪?那些是足以的例如说上边小编那样:

  try
            {
                str = "修改成了a";
                Console.WriteLine("走到:try");
                // return "这里是try返回值";
                return str;
            }
            catch(InvalidCastException e) {
            }
            catch (Exception e)
            {
                Console.WriteLine("走到:catch");
                return "这里是catch返回值";
            }

以此是被允许的,因为这是有含义的写法。

千帆竞发进步

缘何要一定写try-catch-finally 笔者只写个中有的不行吗?

 try-catch

那么大家这一次不写finally试大器晚成试呢。try方法块没有那些已经不用测了,因为上面大家早就确定过了。会回到try的剧情。那么就try格外吧。

 public static string GetStr()
        {
            try
            {
                Console.WriteLine("走到:try");
                int value = 0;
                int s = 1 / value;              
                return "这里是try返回值";
            }
            catch (Exception e)
            {
                Console.WriteLine("走到:catch");
                return "这里是catch返回值";
            }
            return "这里是方法底部返回值";
        }

运转结果:

图片 4

实施深入分析:

因此方可健康运营咱们精晓那样写一些标题都还没,所以结果便是

  • finally亦不是必得的。
  • 假诺catch没有return 就能够回去尾部return方法。那是大家的常识。

像这种类型做有怎么着效果与利益依然意义哪,常常大家得以下面说的概念三个catch来检查评定极度,还会有五个用场正是忽略非凡,便是这种分外你系统能够被运转,就能够catch内不写return平常跳过极其施行上面包车型大巴方法体。不过或不是很被建议,

try-finally

那么try-finally哪,那样写也是被允许的。

那样单独写第后生可畏正是在finally语句块内做try的能源自由。正常状态下try未有非常,在finally中拍卖try语句块的财富自由。

其次正是try产生了极其,其实finally起到的效用照旧长久以来的。然则这里分别在于后生可畏旦那么些未经管理,大概就招致程序退出了。全体执不执行当已漠不关切了。大家来个非常示例:

图片 5图片 6

static void Main(string[] args)
        {
            string result = "";
            try
            {
                result = GetStr();
            }
            catch (Exception e)
            {
                Console.WriteLine("主方法catch:");
            }
            Console.WriteLine(result);
            Console.ReadLine();
        }
        public static string GetStr()
        {
            try
            {
                Console.WriteLine("走到:try");
                int value = 0;
                int s = 1 / value;               
                return "这里是try返回值";
            }

            finally
            {
                Console.WriteLine("走到:finally");
            }

            return "这里是方法底部返回值";
        }

View Code

运维结果:

图片 7

推行解析:

try发生了要命,可是因为finally始终都会举办全体也会进行,然后特别被调用方法内的catch捕获实践各种:try=>finally=>catch(主方法)

抱有大家赢得结果:

  • try-finally能够运作
  • try若无catch可是产生非凡会向上找catch方法块来捕获。知道未有系统崩溃。

如上的例证都以非调控(系统现身非凡就自动抛出了卡塔 尔(英语:State of Qatar)的抛出相当,那么大家能够调节极度的抛出点吗?当然可以。

throw

照旧老习于旧贯先上官方解释,发出程序实践时期现身万分的随机信号。

终归怎么样意思哪,小编个人领会正是一个告诉您是还是不是现身十分的注明,就像随机信号灯同样,亮了什么样颜色就意味着着怎么样看头
,当然便是打个假设。实信号灯一定是没错,可是这几个可不是啊。
回顾来计算她就五个效果与利益:第一是报告外人有极度,第二即是再度发出特别。

报告外人有极度

简易的话便是友好能够定义叁个特出,然后给上层代码管理。(小编正是在这里想告知您有十分卡塔尔

图片 8图片 9

static void Main(string[] args)
        {
            string result = "";
            try
            {
                Console.WriteLine("主方法try:");
                result = GetStr(6);
            }
            catch (IndexOutOfRangeException e)
            {
                Console.WriteLine($"主方法catch抛出异常:{e.GetType().Name}");
            }
            Console.WriteLine("主方法结束");
            Console.ReadLine();
        }
        public static string GetStr(int index)
        {
            if (index < 0 || index > 5)
            {
                Console.WriteLine("进入异常:");
                throw new IndexOutOfRangeException();
            }
            return "正确返回";
        }

View Code

运转结果:

图片 10

实行深入分析:

在主方法里调用GetStr方法,然后传入了6决断步向if然后给本身交到了十二分,退出当前途序踏向主方法捕获特别catch中,捕获到特别打印。这里就呈现了温馨在某种意况下定义三个非凡然后给上层抛出。

双重掀起那几个

以此与地方有如何区别哪,成效没什么区别的,可是意义却不相仿,那一个是本人爆发了非凡可是小编不管理,小编在延续报诀外人让旁人处理。下边大家只必要把地点的GetStr方法订正成那样:

图片 11图片 12

 public static string GetStr(int index)
        {
            try
            {
                if (index < 0 || index > 5)
                {
                    Console.WriteLine("进入异常:");
                    throw new IndexOutOfRangeException();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine($"进入异常catch重新抛出异常:{e.GetType().Name}");
                throw;
            }
            return "正确返回";
        }

View Code

运作结果:

图片 13

进行深入分析:

在主方法里调用GetStr方法,然后传入了6推断步入if然后给和煦付出了要命,在GetStr方法内的catch捕获到卓殊,可是她不曾拍卖,有再次利用Throw来诱惑那三个,把极度传到了上层(主方法卡塔 尔(阿拉伯语:قطر‎,最终依旧主方法的catch来管理非常。

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website