zoukankan      html  css  js  c++  java
  • finally return 执行关系 异常处理 c#

    Returnfinally执行关系简述

    除了函数出现system.exit(0)终止虚拟机,finally中的代码一定执行,return语句会等待finally的执行;如果是值传递,finally中改变的值对trycatch块中return返回的值无影响;如果是引用类型参数(地址传递或对象),finally中的值改变对return会产生影响。

    如果是值类型,压栈的就是经过复制的参数值,如果是引用类型,那么进栈的只是一个引用,这也就是我们所熟悉的,传递值类型时,函数内修改参数值不会影响函数外,而引用类型的话则会影响。

    下面就值传递而言,说明问题。变量拷贝问题。

    提出问题:

        对于初学者来说,接触异常类,老师通常会跟我们说异常处理分为try-catchtry-catch-finallytry-catch-ncatch-catch(Exception e)-[finally]等等结构,参考书中一般还会出现try-finally格式,对异常不做任何处理,直接执行。教科书上还会说finally{……}中的语句一定会执行。

        细心的读者会发现return是退出语句,对后面代码短路,finally中代码一定会执行,这个不矛盾吗?Catch中都return了,还会执行finally?结果是finally中代码是会执行的,但是执行的结果相当于局部变量,是对之前变量的拷贝,改变的值不会对catchreturn值产生影响。

    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语句的returncatch中的returnfinally语句,finally同样不改变catchnum。返回值为1

    3.如果finally中有return语句,程序会出现语法错误。

    结论:

        在trycatch语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。在转去之前,trycatch中先把要返回的结果存放到不同于i的局部变量中去,执行完finally之后,在从中取出返回结果,因此,即使finally中对变量i进行了改变,但是不会影响返回结果。

        在我们知道了return语句并不全对下面的代码短路,改变了我们以往一直错误的观念。但在出现异常处理时finally中的语句执行的结果不一定会对变量产生影响,但真的一定会执行吗?答案是否定的,如果trycatch块里有System.exit(0) 终止当前正在运行的 Java 虚拟机。finally里面的代码是没有机会执行的,这里就不展开了。

    更多细节、运行底层原理请参考博文:http://blog.csdn.net/turkeyzhou/article/details/6024550


  • 相关阅读:
    模块之datetime
    模块之time模块
    模块之相对路径导入
    模块之包跨模块导入
    模块
    迭代器
    leetcode234 回文链表(Easy,不简单)
    leetcode543 二叉树的直径(Easy 不简单)
    leetcode538 把二叉树转换为累加树(Easy,不简单)
    leetcode136 只出现一次的数字(Easy)
  • 原文地址:https://www.cnblogs.com/xiangyangzhu/p/4239791.html
Copyright © 2011-2022 走看看