C#关注异常处理

关于异常,记录一些看到的和自己总结的

for (int i = 0; i <= 2; i++)

{

     try

     {

       int number = Convert.ToInt32("aa");

     }

      catch (Exception ex)

     {

           throw new MyUserException(ex.Message);

      }

}

 

MyUserException是自定义的异常类,把异常信息记入到异常文本error.txt

public class MyUserException : Exception

    {

        private string messageinfo = string.Empty;

        public MyUserException(string message)

            : base(message)

        {

            messageinfo = message;

            OperateException(message);

        }

 

        private void OperateException(string message)

        {

            string path = Directory.GetCurrentDirectory() + @"\error.txt";

            if (File.Exists(path))

            {

                FileStream nFile = new FileStream(path, FileMode.Open);

                StreamWriter sw = new StreamWriter(nFile);

                sw.WriteLine(message);

                sw.Close();

            }

        }

}

 

这是一个很常见的异常捕捉,但是如此的抛出异常并同时写入异常文本后,程序会终止。我们也可以在catch中不用抛出异常,也可写一个异常操作类,专门写入异常信息,可让程序继续进行,但是我经常看到大家在问一个问题就是:如何让存在异常后,让程序继续进行。

我看到很多人的回答是catch中不写任何代码,这样回答其实是不负责任的,很多情况下,比如下列代码

try

{

 for (int i = 0; i <= 2; i++)

     {

             int number = Convert.ToInt32("aa");

  }

}catch ()

 {

 }

String name=”xxx”;

这里我把异常捕捉写在循环外面,如果只是简单的catch中不写任何代码就让程序继续执行循环体,显然这里是做不到的,程序会继续往下执行String name=”xxx”;而不会去执行循环体,所以我们可以考虑把异常捕捉写到循环体内,catch中什么都不写,或者写continue让循环继续

for (int i = 0; i <= 2; i++)

 {

    try

    {

            int number = Convert.ToInt32("aa");

      }

  catch ()

  {

  }

}

 

其实异常捕捉有人说太多try会影响性能,但是实际上,有try和没有try性能差不多,只是在偶尔出现异常后,执行到catch时会消耗很多时间,但是事实上异常并不时时发生,用这点时间换取捕捉到的异常还是值得的,只要你不要把异常捕捉作为程序的逻辑设计,但是不可以否认的是有try catch在编译时是需要耗一些时间的,因为编译模式内要回填异常的处理地址。

.net在产生异常时是逐步向外层查找处理程序的,因此可以说捕获的越早效率越高.如果当前应用程序没有对异常进行处理,就交给runtime,在这种情况下,效率才是最低的,而且比较难于处理。

 

我曾经看过一篇文章,讲述的是抛出异常时,是catch内部抛出实例化异常类效率高,还是在catch调用静态方法,然后在静态方法中抛出异常效率高,例如

 private int GetItOne(int key) {

        int value;

        if (!_dict.TryGetValue(key,out value)) {

            throw new ArgumentOutOfRangeException("key");

        }

        return value;

    }

 和

 private int GetItTwo(int key) {

        int value;

        if (!_dict.TryGetValue(key, out value)) {

            ThrowArgumentOutOfRangeException();

        }

        return value;

    }

 

    private static void ThrowArgumentOutOfRangeException() {

        throw new ArgumentOutOfRangeException("key");

    }

所以说如果自定义一个静态的异常类,然后throw还是有优势的。

参见

http://www.cnblogs.com/tansm/archive/2012/05/13/dotnet_profile1.html#commentform

 

 

posted @ 2012-05-24 10:32  蹦极的馒头  阅读(676)  评论(0编辑  收藏  举报