首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

c# - catch(Exception ex) 会丢掉StackTrace 是咋回事

2013-10-11 
c# - catch(Exception ex) 会丢掉StackTrace 是怎么回事?StackTrace: 保存方法的栈调用信息。什么意思呢?A

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不了?

热点排行