zoukankan      html  css  js  c++  java
  • c#

    原本这篇文章就想写写StackTrace怎么会丢的问题, 但现在的内容变成了讨论怎么处理Exception的问题。

    该不该用try catch, 什么时候用?也困扰了我很久, 好像随便写写就可以, 但是事实上还是有Best Practise, 以下内容请您参考,欢迎指正!


    StackTrace: 保存方法的栈调用信息。

    什么意思呢?A方法里调用了B方法,B方法里调用了C方法,你调用A方法的时候StackTrace里就大概是这样:

    at Project.Class.C in c:aaaProjectclass.cs:line 10.

    at Project.Class.B in c:aaaProjectclass.cs:line 20.

    at Project.Class.A in c:aaaProjectclass.cs:line 30.

    它就是个字符串。

    不过他有什么用呢?你说呢,毕竟人家连行号都告诉你了。如果丢了StackTrace,我们也就丢了这些信息。

    什么情况下会丢StackTrace?看看这段代码:

    [csharp] view plain copy
     
     print?
    1. static void Main(string[] args)  
    2.        {  
    3.            try  
    4.            {  
    5.                // Call Method1  
    6.                Console.WriteLine(Method1());  
    7.            }  
    8.            catch (Exception ex)  
    9.            {  
    10.                Console.WriteLine(ex.StackTrace);  
    11.            }  
    12.            Console.ReadLine();  
    13.        }  
    14.   
    15.        public static int Method1()  
    16.        {  
    17.            try  
    18.            {  
    19.                return Method1_1();  
    20.            }  
    21.            catch (Exception ex)  
    22.            {  
    23.                throw ex;  
    24.            }  
    25.        }  
    26.   
    27.        public static int Method1_1()  
    28.        {  
    29.            int j = 0;  
    30.            return 10 / j;  
    31.        }  


    乍看貌似没有什么问题,但是Method1多做了一件事: Catch(Exception ex){thorw ex;}

    他带来一个后果就是,StackStace会丢.

    得到的StackTrace如下:

       at ExceptionMethodCall.Program.Method1() in c:ProjectsExceptionMethodCallExceptionMethodCallProgram.cs:line 33
       at ExceptionMethodCall.Program.Main(String[] args) in c:ProjectsExceptionMethodCallExceptionMethodCallProgram.cs:line 16

    删除 try..catch, 我们得到的StackTrace如下:

       at ExceptionMethodCall.Program.Method1_1() in c:ProjectsExceptionMethodCallExceptionMethodCallProgram.cs:line 40
       at ExceptionMethodCall.Program.Method1() in c:ProjectsExceptionMethodCallExceptionMethodCallProgram.cs:line 29
       at ExceptionMethodCall.Program.Main(String[] args) in c:ProjectsExceptionMethodCallExceptionMethodCallProgram.cs:line 16

    结果显而易见。

    更多:

    如果Method1代码这么写:

    [csharp] view plain copy
     
     print?
    1. public static int Method1()  
    2.         {  
    3.             try  
    4.             {  
    5.                 return Method1_1();  
    6.             }  
    7.             catch (Exception ex)  
    8.             {  
    9.                 Console.WriteLine(ex.Message);  
    10.                 throw;  
    11.             }  
    12.         }  

    会发生什么?

    注意:这次没有throw ex, 而是 throw.

    我们发现StackTrace又不会丢了:

       at ExceptionMethodCall.Program.Method1_1() in c:ProjectsExceptionMethodCallExceptionMethodCallProgram.cs:line 40
       at ExceptionMethodCall.Program.Method1() in c:ProjectsExceptionMethodCallExceptionMethodCallProgram.cs:line 29
       at ExceptionMethodCall.Program.Main(String[] args) in c:ProjectsExceptionMethodCallExceptionMethodCallProgram.cs:line 16

    原因是什么?

    我就随便说说我的想法, 你这么想也行 不这么想也行, 但是我不负责哦:

    catch(Exception ex) 会实例化一个Exception 对象,其实就是在此处你catch到的这个Exception。你怎么处理它都可以, 写log或者Print出来,

    但是你就是不要throw 它。 你throw它了,exception stack就被清空。没有throw 它, exception stack里就始终保存所有exceptions。

    在更多:

    如果Method1这么写:

    [csharp] view plain copy
     
     print?
    1. public static int Method1()  
    2.         {  
    3.            return Method1_1();  
    4.         }  

    注意:没有写任何try.. catch. 可能有人觉得会丢StackTrace, 事实上不会. 这里Method1() call Method1_1(), 它会完整的保存StackTrace。

    事实上,你写更多层都没有关系, StackTrace依然很完整。

    所以综上所述:

    1. 如非必要, 不要给方法加任何try.. catch.., 只在调用方法的最外层处理Exception;

    2. 如果需要在方法里处理Exception, 你直接catch(Exception ex)处理就好了, 不要throw ex;

  • 相关阅读:
    业务、技术和语言的关系
    查询优化一般原则
    软件构架师的特点(转与Rational Edge)
    VMware安装Vista虚拟机
    使能更改SubVersion日志信息
    清除数据库日志文件
    构建自定义活动以扩展您的工作流的作用范围(转载于MSDN)
    Delphi数据库通用模块及典型系统开发
    Windows Workflow Foundation 2 规则引擎简介
    设置STS服务器配置数据库
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/6119844.html
Copyright © 2011-2022 走看看