日期:2014-05-17  浏览次数:21000 次

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