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

 

你可能感兴趣的:(exception)