try catch裏面try catch嵌套

try catch裏可否內嵌try catch?答案是確定的。可是等內層try catch出異常以後是個什麼執行順序呢?看下面代碼spa

 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。code

我們把內層的catch註釋掉  再試下blog

 

 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捕獲了異常。string

總結:try catch嵌套,內層不能捕獲時,會考慮外層內否捕獲,內層能捕獲,則外層catch不執行。it

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

上面的代碼 執行順序io

拋出異常在:內層A,E處由外層catch塊捕獲,並執行外層finally  
拋出異常在:內層B處,且有一合適內層catch捕獲,執行內層finally,後執行E處  
拋出異常在:內層B處,但內層catch塊沒有合適處理程序,執行內層finally,搜索外層catch,找合適的,執行外層finally,此時不會執行E  
拋出異常在:內層C處,退出內層catch塊,執行內層finally,搜索外層catch,找到合適,執行外層finally  
 拋出異常在:內層D處,退出內層finally塊,搜索外層catch,找到合適,執行外層finally  class

A拋異常 A=》F=》G搜索

B拋異常 C能捕獲 B=》C=》D=》E=》F=》G (若C處沒法捕獲B=》F=》G)程序

C拋異常 C=》D=》F=》Gim

D拋異常 D=》F=》G

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

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

相關文章
相關標籤/搜索