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操做引起的異常。