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)