关于.NET的异常处理的几个误区

时间:2010-02-21 09:37:41  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:一个catch的错误用法:      catch(Exception e)   {    throw e;   }   首先说明,这不是一个错误用法,但是通常来讲,我们应该避免这种代码。然后要说明的是,这段代码有一个比较典型的作用就是改变异常出现的位置,也就是可以对某类异常统一在一个位置处理。先看下面代码: &n...
  正文:很久前就想写这么一篇文章,因为很多人使用.Net多年之后还是对异常处理一知半解的,有很多误解,本文将讲解三个常见误解,一个是catch的使用方法是否正确,另外两个是try/catch的性能损失问题。
  
  有些人认为下面代码就是一个catch的错误用法:
  
  catch(Exception e)
  {
   throw e;
  }
  首先说明,这不是一个错误用法,但是通常来讲,我们应该避免这种代码。然后要说明的是,这段代码有一个比较典型的作用就是改变异常出现的位置,也就是可以对某类异常统一在一个位置处理。先看下面代码:
  
   public int GetAllCount2()
   {
   try
   {
   openDB();
   int i = 1;
   return i;
   }
   catch (SqlException sex)
   {
   throw sex;
   }
   catch (Exception ex)
   {
   throw ex;
   }
   }
   public int GetAllCount()
   {
   openDB(); // 这里也可能是微软企业类库等
   int i = 1;
   return i;
   }
  
   private void openDB()
   {
   conn.Open();
   }
  假设我们有一个公用方法叫openDB(),而很多方法中调用它,当数据库打开失败的时候,对于调用GetAllCount方法,异常将定位于conn.Open而如果调用GetAllCount2,那么异常定位于throw sex的位置,同时堆栈信息也有所不同,可以更快捷的找到调用方法的位置,也可在此位置进行一些错误恢复处理。尤其是我们编写一些底层类库的时候,比如Framework类库从不会把异常代码定位到Framework类库内部的某个方法上面。但是需要注意的是我们尽量避免捕获异常而不返回,例如 catch(){}
  这样的使用就是典型的错误使用了,因为对于Framework来讲,任何时候系统都可能抛出一个StackOverflowException或者OutOfMemoryExcetpion而上面这段代码则隐藏了这些异常,有时候则导致一些严重的问题。
  
  
  对于异常处理,在性能上有2点注意
  
  第一点,在使用try/catch时,如果不发生异常,那么几乎可以忽略性能的损失。
  
  关于这一点,这里我们进行一些深入分析,对此比较了解的可以跳过本节。首先,让我们先看一下try/catch的IL表现。我们有2个方法,一个使用try/catch,而另一个未做任何处理:
  
  static int Test1(int a, int b)
  {
   try
   {
   if (a > b)
   return a;
   return b;
   }
   catch
   {
   return -1;
   }
  }
  
  static int Test2(int a, int b)
  {
   if (a > b)
   return a;
   return b;
  }
  使用ILDasm工具查看,IL代码分别如下:(这里之所以引入IL,是因为IL是比较接近机器汇编,所以在IL中我们可以更清楚的了解代码的执行情况,对IL没有兴趣的可以跳过此节)
  
  
  .method private hidebysig static int32 Test1(int32 a,
   int32 b) cil managed
  {
   // 代码大小 30 (0x1e)
   .maxstack 2
   .locals init ([0] int32 CS$1$0000,
   [1] bool CS$4$0001)
   IL_0000: nop
   .try
   {
   IL_0001: nop
   IL_0002: ldarg.0
   IL_0003: ldarg.1
   IL_0004: cgt
   IL_0006: ldc.i4.0
   IL_0007: ceq
   IL_0009: stloc.1
   IL_000a: ldloc.1
   IL_000b: brtrue.s IL_0011
   IL_000d: ldarg.0
   IL_000e: stloc.0

"关于.NET的异常处理的几个误区"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Programming/aspnet/12865.html


关键字:

关于《关于.NET的异常处理的几个误区》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td