C#中throw的用法_异常路径

在C#的异常处理中,有一个关键字是throw,大家一定在catch块中或多或少的使用过,那么是否注意过不同的throw语句抛出的异常有何区别,请看下面的例子。

 

例1

class Program
    {
       static void Main(string[] args)
       {
           LoggerFileFactory.ConfigurationFilePath =Path.Combine(AppDomain.CurrentDomain.BaseDirectory,@"Config\log4net.config");
           try
           {
                Class2.Test();
            }
           catch (Exception ex)
           {
               AppLogger.ApplicationLogger.Error("err", ex);
           }
       }
    }
 
   class Class1
    {
       public static void Test()
       {
           throw new Exception("class1");
       }
    }
 
   class Class2
    {
       public static void Test()
       {
           try
           {
                Class1.Test();
           }
           catch (Exception ex)
           {
                //do something
                throw ex;
           }
       }
    }


使用log4net输出的日志如下:

 

例2

下一步,我们将Class2稍作修改

class Class2
    {
       public static void Test()
       {
           try
           {
                Class1.Test();
           }
           catch (Exception ex)
           {
                //do something
                throw;
           }
       }
    }

输出日志如下:

 

例3

我们再来修改下class2,这一次的改动稍微增大

class Class2
    {
       public static void Test()
       {
           try
           {
                Class1.Test();
           }
           catch (Exception ex)
           {
                //do something
                throw newException("class2", ex);
           }
       }
    }



       仔细观察三次的异常日志一定会有所发现,。在例1中,虽然异常的描述信息是class1,但是log4net记录的异常堆栈信息缺没有class1的踪影,只记录下了class2.Test()。而例2中的日志不只记录下了异常的描述信息,而且完整的记录下了引发异常方法的调用信息。

        不同点在哪里,请注意例1中在throw的时候使用了参数ex,而例2没有参数,这个无参的throw可以看做为rethrow(即继续抛出),他会抛出之前捕获到的所有异常。而2中带参数的则不同,他虽然会抛出同样的异常,但是异常的堆栈信息缺在throw的时候被改变了,我们在接下来的try块中无法获取异常的原始信息。例3则完全是一个新的异常,class1中抛出的异常被当做内部异常,存放在innerexception中。

 

         C#为我们提供了相当完备的异常路径,我们可以通过不同的throw方式使异常的路径可选。在实际的使用中需要根据不同的使用场景,选择不同的throw方式。比如需要查看完整的异常路径时,我们应该使用2中的方式,即不带参数的throw。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值