你真的知道吗?catch、finally和return哪个先执行

这篇具有很好参考价值的文章主要介绍了你真的知道吗?catch、finally和return哪个先执行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我的一位朋友前阵子遇到一个问题,问题的核心就是try……catch……finally中catch和finally代码块到底哪个先执。这个问题看起来很简单,当然是“catch先执行、finally后执行”了?真的是这样吗?

有下面一段C#代码,请问这段代码的执行结果是什么?

public static void Main(string[] args)
{
      try
      {
            A();
      }
      catch
      {
            Console.WriteLine("catch!!!");
      }
}

static void A()
{
      try
      {
            throw new Exception();
      }
      finally
      {
             Console.WriteLine("finally!!!");
      }
}

 

A()方法的try代码块中抛出了异常,而A方法没有处理这个异常,所以Main方法的catch代码块会捕获这个异常,但是A()方法中又有finally代码块,那么到底是异常抛出后先执行Main方法的catch代码块呢还是先执行A()方法中的finally代码块呢?运行一下程序就能看出来,是finally代码块执行,结果如下所示。

finally!!!
catch!!!

 

为什么呢?这需要从方法调用的异常对象如何传递给被调用方法讲起。在一段代码调用一个方法的时候,被调用的方法会把返回值、异常对象等放到一个特定的位置,这个位置叫做Stack Frame,调用者代码会从这个特定的位置获得被调用方法的返回值、异常对象等信息。因此,无论是throw异常的时候还是return返回值的时候,被调用的方法只是把异常对象或者返回值放到了这个特定的位置,在return或者throw执行之后,如果方法中还有finally等没有执行完成的代码,那么这些代码仍然会在return、throw之后继续执行,然后方法执行才会结束,之后调用这个方法的代码才会从Stack Frame中读取到返回值或者获取到被调用的方法抛出的异常对象。因此,上面的代码才会先执行finally然后才执行catch。

明白了这个道理,请回答一下,下面代码的执行结果是什么?

public static void Main(string[] args)

{

      try

      {

            A();

      }

      catch(Exception ex)

      {

            Console.WriteLine(ex.Message);

      }

}

static void A()

{

      try

      {

            throw new Exception("aa");

      }

      finally

      {

            throw new Exception("bb");

      }

}

 

上面这是一段很特殊的代码,在try代码块中抛出了一个异常(信息是aa),在finally中也抛出了一个异常(信息是bb),那么程序实际打印出来的异常信息是什么呢?上面程序执行结果是“bb”。通过上面的分析不难理解其原理:try代码块中的throw new Exception("aa")把方法的异常对象设置为Exception("aa"),而finall代码块中的throw new Exception("bb")又把方法的异常对象修改为Exception("bb"),因此最终方法抛出的异常对象是Exception("bb")。

接下来,我们再来捉弄一下方法的返回值,我们尝试在finally代码块中修改方法的返回值。不幸的是(也可以说,幸运的是),C#禁止我们在finally代码块使用return语句,不过我们可以在Java中做这样的尝试,如下Java代码所示:

public static void main(String[] args)
{
      System.out.println(A());
}

static int A()
{
      try
      {
            return 1;
      }
      finally
      {
            return 2;
      }
}

 

我们在try代码块中通过return 1把方法的返回值设置为1,但是在finally代码块中又把方法的返回值设置为2,因此方法的最终返回值就是2。

综上所述,一个方法中通过return设定返回值或者throw抛出异常的时候,方法并没有立即返回,只是在Stack Frame上保存了这个返回值或者异常对象,然后会继续执行finally中的代码,如果我们在finally代码块中修改了返回值或者抛出了新的异常,那么最终的调用中获得的返回值或者捕获的对象就是修改后的返回值或者异常对象。文章来源地址https://www.toymoban.com/news/detail-621989.html

到了这里,关于你真的知道吗?catch、finally和return哪个先执行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • try catch执行过程分析

    本篇文章带大家聊聊try catch的执行过程,有时候在开发的过程中,try代码里如果出现异常,catch后的步骤还会继续执行吗?以及finally的使用。 下面来分析一下几种使用场景: 场景一: try代码块中出现异常后,系统会继续执行catch代码块的程序。catch代码块外的代码也会继续被

    2024年02月15日
    浏览(41)
  • 【Java练习题汇总】《第一行代码JAVA》异常处理篇,汇总Java练习题——异常的概念及处理标准格式(try、catch、finally、throws、throw)、断言机制 Assertion ~

    一、填空题 Throwable 下的两个子类是______________ 、______________ 。 ArthmeticException 类表示______________ 异常, ArraysIndexOutOfBoundsException 表示______________ 异常。 一个 try 代码后面必须跟着若干个_______ 代码段或者一个_______ 代码段。 如果一个方法使用了_______ , 则编译器会强制在使用此

    2024年02月16日
    浏览(41)
  • ai写作工具哪个好,我的答案是它们

    嘿嘿,今天来给各位小伙伴们秀一下这些文案~ 1.\\\"探索未知,发现惊喜!加入我们的冒险队,一起探索神秘的世界,解锁未知的宝藏!\\\" 2.\\\"不要错过这个夏天的狂欢!炎热的太阳、清凉的海风,让我们一起畅快尽情地享受夏日的快乐!\\\" 3.\\\"让时间停驻,与美食相伴。品味经典的

    2024年02月04日
    浏览(27)
  • 不知道开黑语音哪个软件好?

    黑盒语音官方网站:https://chat.top 免费支持AI降噪 免费支持高品质立体声 免费支持码率128Kbps,192Kbps 免费支持上传100M文件 免费支持动态房间头像和横幅 支持更多自定义动态表情 即将支持更多免费功能        

    2024年02月12日
    浏览(33)
  • ai特效绘画怎么弄的?你真的知道吗?

    随着人工智能技术的迅猛发展,越来越多的软件和工具应用ai技术来创造出令人惊叹的艺术效果。那你知道ai特效绘画怎么弄吗? 本文将介绍下面三款软件的ai特效绘画功能,并提供不同软件的操作步骤,让你一窥ai在艺术领域的奇妙魅力。 方法一、使用AI智绘进行ai特效绘画

    2024年02月12日
    浏览(42)
  • 你真的知道 HTTP OPTIONS 方法的作用吗?

    目录 HTTP OPTIONS 方法定义 HTTP OPTIONS 请求格式 HTTP OPTIONS 响应格式 OPTIONS 方法的作用与使用场景 OPTIONS 响应的头部信息详解 小结 HTTP(Hypertext Transfer Protocol,超文本传输协议)是互联网中被使用最广的一种网络协议,用于客户端与服务器之间的通信。HTTP 协议定义了一系列的请

    2024年04月26日
    浏览(31)
  • 你真的知道如何查看 Elasticsearch 的 Debug 日志吗?!

    当我们遇到问题或者需要深入了解 Elasticsearch 的运行机制时,调整日志等级(  logging level  )到更详细的级别,比如  DEBUG 、 TRACE  ,会是一个有效且必须要掌握的方法。 Elasticsearch 提供了如下的接口来支持动态变更 logging level,logger 后面是 package name 或者 class name。 当然,

    2024年01月20日
    浏览(35)
  • 前沿技术探究|区块链的故事你真的知道吗?

    前言: 区块链的作用是实现去中心化的安全数据传输和交易验证。 区块链是在2008年由中本聪(Satoshi Nakamoto)提出的概念,它作为比特币(Bitcoin)的底层技术而首次被广为人知。中本聪提出区块链作为一种去中心化的分布式账本技术, 旨在解决传统金融系统中的信任问题

    2024年02月08日
    浏览(52)
  • [Selenium]你真的知道怎么提高Selenium的运行速度吗?

    对于网上流传的提高selenium的方法有很多,但从程序运行的感官上来看,感觉提速并不明显。所以,我特地做了一些测试,寻找最优方案。 但是,由于对不同组的测试次数并不相同,结果可能不太严谨。但是,一般来说,结果基本都在一定范围内浮动,所以结果和多次测试大

    2024年02月06日
    浏览(41)
  • Selenium | 你真的知道怎么提高Selenium的运行速度吗?

    对于网上流传的提高selenium的方法有很多,但从程序运行的感官上来看,感觉提速并不明显。所以,我特地做了一些测试,寻找最优方案。 但是,由于对不同组的测试次数并不相同,结果可能不太严谨。但是,一般来说,结果基本都在一定范围内浮动,所以结果和多次测试大

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包