catch(Exception ex) 会丢掉StackTrace 是怎么回事?

时间:2022-01-16 04:17:19

原本这篇文章就想写写StackTrace怎么会丢的问题, 但现在的内容变成了讨论怎么处理Exception的问题。

该不该用try catch, 什么时候用?也困扰了我很久, 好像随便写写就可以, 但是事实上还是有Best Practise, 以下内容请您参考,欢迎指正!


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?看看这段代码:

[csharp]  

 

 

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

结果显而易见。

更多:

如果Method1代码这么写:

[csharp]  

 

 

public static int Method1()  

        {  

            try  

            {  

                return Method1_1();  

            }  

            catch (Exception ex)  

            {  

                Console.WriteLine(ex.Message);  

                throw;  

            }  

        }  

会发生什么?

注意:这次没有throw ex, 而是 throw.

我们发现StackTrace又不会丢了: