通常,我們使用try/catch/finally語句塊來捕獲異常,就像在這裡說的。在拋出異常的時候,使用throw和throw ex有什麼區別呢?
假設,按如下的方式調用幾個方法:
→在Main方法中調用Method1方法,try/catch捕獲異常
→在Method1方法中調用Method2方法,try/catch捕獲異常
→在Method2方法中故意拋出異常,try/catch捕獲異常
使用throw拋出異常
static void Main(string[] args){try{Method1();}catch (Exception ex){Console.WriteLine(ex.StackTrace.ToString());}Console.ReadKey();}static void Method1(){try{Method2();}catch (Exception ex){throw;}}static void Method2(){try{throw new Exception("來自方法2的異常");}catch (Exception ex){throw;}}
可以看到,使用throw拋異常,把發生在Method2方法、Method1方法和Main方法中的異常全部拋了出來。
使用throw ex拋出異常
現在,在Method1方法中,使用throw ex拋出異常。
static void Method1(){try{Method2();}catch (Exception ex){throw ex;}}
可見, 使用throw ex拋異常,只會把Method1方法和Main方法中的異常拋出來。
總結:如果想獲取最完整的StackTrace信息,使用throw拋出異常,從中可以知道異常到底來自哪個方法。