trycatchfinally详解,你不知道秘密
Posted yanbigfeg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了trycatchfinally详解,你不知道秘密相关的知识,希望对你有一定的参考价值。
介绍
不管是新手还是工作几年的老油条,对try{}catch{}来说是不陌生的。他可以来帮助我们获取异常信息,在try中的代码出现错误,火灾catch代码块中被捕获到。官方也给了详细的解释:。
抛出异常时,公共语言运行库(CLR)会查找catch
处理此异常的语句。如果当前正在执行的方法不包含这样的catch
块,则CLR会查看调用当前方法的方法,依此类推调用堆栈。如果未catch
找到任何块,则CLR向用户显示未处理的异常消息并停止执行该程序。
以上的这些基础我们可能都了解。但是你真的了解他的运行步骤吗?我就是带着这个疑问进行了一下的几个测试。
代码示例:
既然有了疑问就带着疑问想办法验证吧,下面我们通过多个例子来一步一步的分析得到我们想要的结果。
简单的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 "这里是方法底部返回值"; }
运行结果:
执行分析:
这是最简单最常见的示例,没有发生异常,然后没有走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 "这里是方法底部返回值"; }
运行结果:
执行分析:
这里在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 "这里是方法底部返回值"; }
运行结果:
执行分析:
没有异常还是老样子:执行顺序是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返回值"; }
这个是被允许的,因为这是有意义的写法。下班了未完待续..
以上是关于trycatchfinally详解,你不知道秘密的主要内容,如果未能解决你的问题,请参考以下文章