StackTrace: 保存方法的棧調用信息。 什麼意思呢?A方法裡調用了B方法,B方法裡調用了C方法,你調用A方法的時候StackTrace裡就大概是這樣: at Project.Class.C in c:\aaa\Project\class.cs:line 10. at Project.Class.B in c:\aaa\Project\class.cs:line 20. at Project.Class.A in c:\aaa\Project\class.cs:line 30. 它就是個字符串。 不過他有什麼用呢?你說呢,畢竟人家連行號都告訴你了。如果丟了StackTrace,我們也就丟了這些信息。 什麼情況下會丟StackTrace?看看這段代碼:
static void Main(string[] args) { try { // Call Method1 Console.WriteLine(Method1()); } catch (Exception ex) { Console.WriteLine(ex.StackTrace); } Console.ReadLine(); } public static int Method1() { try { return Method1_1(); } catch (Exception ex) { throw ex; } } public static int Method1_1() { int j = 0; return 10 / j; }
乍看貌似沒有什麼問題,但是Method1多做了一件事: Catch(Exception ex){thorw ex;} 他帶來一個後果就是,StackStace會丟. 得到的StackTrace如下: at ExceptionMethodCall.Program.Method1() in c:\Projects\ExceptionMethodCall\ExceptionMethodCall\Program.cs:line 33 at ExceptionMethodCall.Program.Main(String[] args) in c:\Projects\ExceptionMethodCall\ExceptionMethodCall\Program.cs:line 16 刪除 try..catch, 我們得到的StackTrace如下: at ExceptionMethodCall.Program.Method1_1() in c:\Projects\ExceptionMethodCall\ExceptionMethodCall\Program.cs:line 40 at ExceptionMethodCall.Program.Method1() in c:\Projects\ExceptionMethodCall\ExceptionMethodCall\Program.cs:line 29 at ExceptionMethodCall.Program.Main(String[] args) in c:\Projects\ExceptionMethodCall\ExceptionMethodCall\Program.cs:line 16 結果顯而易見。 結論:以後還亂加try..catch不了?