• 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

  • 相关阅读:
    数据结构之c++感悟
    常见linux系统中RPM包的通用命名规则
    scripts
    http
    iscsi
    RHCE认证经典考题
    数据库
    配置空客户端邮件
    配置nfs服务
    Python版本的7大排序
  • 原文地址:https://www.cnblogs.com/yinhaichao/p/2516135.html
Copyright © 2020-2023  润新知