当前位置:编程学习 > C#/ASP.NET >>

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

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不了?
补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,