C#中異常捕獲相信你們都很熟悉,常用的異常捕獲有:
1. try{.....} catch (Exception ex) {throw ex;}
2. try{.....} catch (Exception) {throw;}
3. try{.....} catch (Exception ex) {throw new Exception("異常描述",ex);}
相信對於這3種寫法你們都很熟悉,但對於這3種之間的細微區別不知你們是否清楚。今天我就給你們分享一下他們之間的區別以及哪一種狀況下使用哪一種捕獲方式比較好。
首先請你們看看下面這段代碼:
static void Main(string[] args)
{
try
{
Test1();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
}
Console.ReadKey();
}
static void Test1()
{
try
{
Test2();
}
catch (Exception ex)
{
//throw ex;
//throw;
//throw new Exception(ex.Message, ex);
}
}
static void Test2()
{
throw new Exception("這兒拋出的異常");
}
咱們的Test2方法拋出異常,在Test1中調用,而且捕獲這個異常。而後在上層main方法中調用Test1方法,捕獲裏面拋出來的異常。在Test1中咱們分別使用3種捕獲異常的方式,看看有什麼不一樣的地方。
首先 try{ .....}catch (Exception ex){throw ex;}方式捕獲異常:
能夠看到,在上層方法main方法中捕獲的異常堆棧信息只能捕獲到33行,而咱們真實的異常是出如今39行的。
在看看try{.....} catch(Exception){throw;}方式捕獲異常:
能夠看到,使用這種方法,異常堆棧信息精確的定位到了異常的產生位置39行。
最後在看看使用try{.....} catch(Exception ex){throw new Exception("異常描述",ex);}方式捕獲異常的區別:
能夠看到,在使用這種方式捕獲異常的話,上層方法main捕獲的異常堆棧信息是從Test1方法開始的,也就是35行;而異常精確產生的堆棧信息是包含在InnerException 屬性的對象裏面的。
從上面的實驗能夠看出:
第一種捕獲異常的方法會丟失真實的異常堆棧信息。
第二種能夠完整的捕獲異常堆棧信息。
第三種也能夠完整的捕獲異常堆棧信息,還能夠自定義異常描述信息。
綜上,3種捕獲方式更適合在哪一種狀況下使用,就明瞭了:
1. try{.....} catch (Exception ex) {throw ex;}
不推薦使用
2. try{.....} catch (Exception) {throw;}
在不對異常信息進行修飾或改變的時候推薦使用,也是代碼段自動生成的默認方式
3. try{.....} catch (Exception ex) {throw new Exception("異常描述",ex);}
在須要對異常信息進行自定義描述的時候使用