try catch里面try catch嵌套


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=》F=》G

D拋異常 D=》F=》G

E拋異常 A=》F=》G 同A

另外 try{}catch{} 中未做捕獲類型限定,可捕獲所以異常。如 try{}catch(IOException ex){} 則catch只能捕獲I/O操作引發的異常。

(文章摘自--http://www.cnblogs.com/zhangchengye/p/5674240.html)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM