zoukankan      html  css  js  c++  java
  • try..catch..finally执行顺序return

    try..catch..finally这个语法大家都很熟悉,就是捕捉异常、处理异常,面试中经常被问到的一个问题是:如果在try...catch中的某某地方return了,那么之后的某某步骤还会不会执行。今天就来用代码分析一下各种可能的执行情况,懒得看文章的话,直接看最后的总结,如果不明白再回头看文章。

    1.首先要明确一个,在finally里面是不能执行return语句的,如果在finally中使用了return,则会提示这样的错误:“控制不能离开 finally子句主体”。如图1:      

                  

                      图1

    2.只有try中有return语句

    当一个捕捉异常语句中只有try语句中有return时,如下代码:

    private string   tryFun(int num)
    {
         int result = 0;
         try
         {
              result = 10 / num;
              return "1";
         }
         catch
         {                
         }
         finally
         {
                    
         }
         return "-2";
    }

    如果这时候num的值为0,则会出现除0的异常,则return “1”不执行,而去执行catch,因为此时假设只有try中有return语句,所以当catch执行完之后将会执行函数最后的return “-2”语句;如果try语句块中没有异常,则return "-2"语句不执行。

    3.只有catch中有return语句

    当一个捕捉异常语句中只有catch语句中有return时,如下代码:

    private string   tryFun(int num)
    {
         int result = 0;
         try
         {
              result = 10 / num;         
         }
         catch
         {                
                return "-1";
         }
         finally
         {
                    
         }
         return "-2";
    }    

    如果这时候num的值为0,则会出现除0的异常,则去执行catch,因为此时假设只有catch中有return语句,所以当catch执行完之后直接return “-1”,就不执行finally之后的语句(finally块中的语句肯定是会执行的),也就是在这里return “-2”语句不执行。

    4.当try...catch中都有return语句

    当try...catch中都有return语句,代码如下:

     private string   tryFun(int num)
     {
          int result = 0;
          try
          {
              result = 10 / num;
              return "try";
          }
          catch
          {
              return "catch";
          }
          finally
          {
          }
          return "-2";
     }

    这时,不管执行的是try还是catch中的语句,return “-2”永远都不执行,也就是finally之后的语句都不执行了(finally里面的语句肯定还是执行啦)。

    总结:不管是执行try还是catch,finally中的语句肯定是会执行的;不管是执行try还是catch,如果所执行的语句中(try和catch中的return只有一个会执行,如果被catch了,肯定是执行catch语句中的return;如果没有被catch,那肯定是执行try中的return。这里假设它们中有return,如果没有return,肯定会执行finally后面的语句)有return语句,则finally之后的语句就不执行(finally里面的语句肯定还是执行啦);如果是执行try或catch中的语句块没有return语句,则finally后面的语句还是会执行的。

  • 相关阅读:
    VS2013
    有了门面,程序会更加体面!- pos软件基于三层架构 -09
    无熟人难办事?- 闲聊设计模式-迪米特法则
    三层架构,分层开发
    Filezilla 错误
    归档和压缩
    在Linux系统下用dd命令制作ISO镜像U盘启动盘
    脚本语言
    node.js知识点提取
    npm cnpm
  • 原文地址:https://www.cnblogs.com/LJP-JumpAndFly/p/3962580.html
Copyright © 2011-2022 走看看