try catch里面try catch嵌套

try catch里面try catch嵌套trycatch里能否内嵌trycatch?答案是肯定的。但是等内层trycatch出异常之后是个什么执行顺序呢?看下面代码staticvoidMain(string[]args){try{Console.WriteLine(“———————-外层try——————————“);error

大家好,又见面了,我是你们的朋友全栈君。

try catch里能否内嵌try catch?答案是肯定的。但是等内层try catch出异常之后是个什么执行顺序呢?看下面代码

 static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("----------------------外层try------------------------------");
                errorMethod();               
            }
            catch (Exception ex)
            {
                Console.WriteLine("----------------------外层catch" + ex.Message + "------------------------------");
            }
            finally {
                Console.WriteLine("----------------------外层finally------------------------------");
            }

            Console.ReadKey();


        }

        private static void errorMethod()
        {           
            try
            {
                Console.WriteLine("----------------------内层try------------------------------");
                int i = 0;
                int a = 100/i;
            }
            catch (Exception ex)
            {
                Console.WriteLine("----------------------内层catch" + ex.Message + "------------------------------");
            }
            finally {
                Console.WriteLine("----------------------内层finally------------------------------");
            }
        }

在这里插入图片描述

内层catch处理了异常,所以没有执行外层catch。

咱们把内层的catch注释掉 再试下

 static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("----------------------外层try------------------------------");
                errorMethod();               
            }
            catch (Exception ex)
            {
                Console.WriteLine("----------------------外层catch" + ex.Message + "------------------------------");
            }
            finally {
                Console.WriteLine("----------------------外层finally------------------------------");
            }

            Console.ReadKey();


        }

        private static void errorMethod()
        {           
            try
            {
                Console.WriteLine("----------------------内层try------------------------------");
                int i = 0;
                int a = 100/i;
            }
            //catch (Exception ex)
            //{
            //    Console.WriteLine("----------------------内层catch" + ex.Message + "------------------------------");
            //}
            finally {
                Console.WriteLine("----------------------内层finally------------------------------");
            }
        }

在这里插入图片描述

很明显,外层catch捕获了异常。

总结:try catch嵌套,内层不能捕获时,会考虑外层内否捕获,内层能捕获,则外层catch不执行。

     try
        {
            //A  
            try
            {
                //B 
            }
            catch
            {
                //C  
            }
            finally
            {
                //D  
            }
            //E  
        }
        catch
        {
            //F
        }
        finally
        {
            //G
        }

上面的代码 执行顺序

抛出异常在:内层A,E处由外层catch块捕获,并执行外层finally
抛出异常在:内层B处,且有一合适内层catch捕获,执行内层finally,后执行E处
抛出异常在:内层B处,但内层catch块没有合适处理程序,执行内层finally,搜索外层catch,找合适的,执行外层finally,此时不会执行E
抛出异常在:内层C处,退出内层catch块,执行内层finally,搜索外层catch,找到合适,执行外层finally
抛出异常在:内层D处,退出内层finally块,搜索外层catch,找到合适,执行外层finally

A抛异常 A=》F=》G

B抛异常 C能捕获 B=》C=》D=》E=》F=》G (若C处无法捕获B=》F=》G)

C抛异常 C=》D=》F=》G

D抛异常 D=》F=》G

E抛异常 A=》F=》G 同A

另外 try{}catch{} 中未做捕获类型限定,可捕获所以异常。如 try{}catch(IOException ex){} 则catch只能捕获I/O操作引发的异常。

转载于:https://www.cnblogs.com/zhangchengye/p/5674240.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148528.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号