finally return 执行关系 异常处理 c#
2014-05-08 07:21
441 查看
Return、finally执行关系简述
除了函数出现system.exit(0)终止虚拟机,finally中的代码一定执行,return语句会等待finally的执行;如果是值传递,finally中改变的值对try或catch块中return返回的值无影响;如果是引用类型参数(地址传递或对象),finally中的值改变对return会产生影响。如果是值类型,压栈的就是经过复制的参数值,如果是引用类型,那么进栈的只是一个引用,这也就是我们所熟悉的,传递值类型时,函数内修改参数值不会影响函数外,而引用类型的话则会影响。
下面就值传递而言,说明问题。变量拷贝问题。
提出问题:
对于初学者来说,接触异常类,老师通常会跟我们说异常处理分为try-catch、try-catch-finally、try-catch-n个catch-catch(Exception e)-[finally]等等结构,参考书中一般还会出现try-finally格式,对异常不做任何处理,直接执行。教科书上还会说finally{……}中的语句一定会执行。细心的读者会发现return是退出语句,对后面代码短路,finally中代码一定会执行,这个不矛盾吗?Catch中都return了,还会执行finally?结果是finally中代码是会执行的,但是执行的结果相当于局部变量,是对之前变量的拷贝,改变的值不会对catch中return值产生影响。
finally_return实例
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace finallyReturn { class Program { static void Main(string[] args) { int num= Test_Finally_Return.Test(); Console.WriteLine("num={0}",num); Console.ReadKey(); } } class Test_Finally_Return { public static int Test() { int num =0; try { num = 1; throw new Exception("手动控制抛出异常"); //若将throw注释掉,通过try中return返回,即正常执行时会不会执行finally,答案是会执行,但函数返回-1 //return -1; } catch (Exception e) { Console.WriteLine(e.Message); return num; //输出是多少??思考??输出num=1;相信很多人会认为返回2,这里面相当于是变量copy,finally中的变量改变对return值无影响。 } finally { num++;//若果执行,那么返回应该是多少????执行了,num=2 Console.WriteLine("我在Finally中num={0}",num); //return 5;//finall中不能包含return语句,否则会报错 } } } }
实例结果解释:
1.没有异常时,走try语句的return,走finally语句,但finally中不影响num值,返回值为-1。
2.有异常时,不走try语句的return,走catch中的return,走finally语句,finally同样不改变catch中num值。返回值为1。
3.如果finally中有return语句,程序会出现语法错误。
结论:
在try或catch语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。在转去之前,try或catch中先把要返回的结果存放到不同于i的局部变量中去,执行完finally之后,在从中取出返回结果,因此,即使finally中对变量i进行了改变,但是不会影响返回结果。在我们知道了return语句并不全对下面的代码短路,改变了我们以往一直错误的观念。但在出现异常处理时finally中的语句执行的结果不一定会对变量产生影响,但真的一定会执行吗?答案是否定的,如果try或catch块里有System.exit(0) 终止当前正在运行的 Java 虚拟机。finally里面的代码是没有机会执行的,这里就不展开了。
更多细节、运行底层原理请参考博文:http://blog.csdn.net/turkeyzhou/article/details/6024550
相关文章推荐
- finally return 执行关系 异常处理 c#
- c#描述异常处理语句try、catch、finally执行时的相互关系
- c#描述异常处理语句try、catch、finally执行时的相互关系
- c#描述异常处理语句try、catch、finally执行时的相互关系
- C#基础知识梳理系列十:异常处理 System.Exception
- Head First C# 中文版 第10章 异常处理 翻译完毕 PDF下载
- C# FileStream异常处理以及委托
- 【C#】常见的异常及异常处理方式
- SQLite数据库指令参数出现中文引起执行异常问题处理
- 异常信息:CLR无法从COM 上下文0x645e18 转换为COM上下文0x645f88,这种状态已持续60秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作.这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积
- 对象的当前状态使该操作无效 说明: 执行当前 Web 请求期间,出现未处理的异常。
- 天轰穿C# -vs2010 - 03C#的异常处理之编写更高质量的代码[原创]
- 在C#中利用Keep-Alive处理Socket网络异常断开的方法
- C#语法小知识(十五)异常处理
- 自己动手实现简单对象关系库谈到异常的处理与抛出
- 一道异常处理执行顺序面试题的简单分析
- 09 java的代码的执行顺序和异常处理
- c#中的异常处理
- C# 如何处理抛出的异常,或者已知的错误
- C#读写Word文档异常处理解析System.Runtime.InteropServices.COMException