读书人

c# - catch(Exception ex) 会丢掉Stac

发布时间: 2013-10-11 14:52:39 作者: rapoo

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#

热点推荐