2019.03.28 读书笔记 关于try catch

try catch 在不异常的时候不损耗性能,耗损性能的是throw ex,所以在非异常是,不要滥用throw,特别是很多代码习惯:if(age<0) throw new Exception("年龄不能小于0"),这种代码。

另外throw 有多种写法

try catch(ex) { throw ex; }这种代码是表示ex 已经被处理了,又重新抛出了ex异常,重置了错误信息,导致找不到真正的异常位置。

try catch { throw } 直接抛出

try catch(Exception){ throw} 如上

另外,如果如果实在需要增加异常说明,可以改成如下:

try catch(Exception ex){ throw new Excrption("连接失败!",ex) ;}这种形式会将原始异常一起抛出。

winform中的线程,需要用委托的形式将ex抛到UI线程,否则只会导致程序退出。

Thread t = new Thread((ThreadStart)delegate
            {
                try
                {
                    throw new Exception("非窗体线程异常");
                }
                catch (Exception ex)
                {
                    this.BeginInvoke((Action)delegate
                    {
                        throw ex;
                    });
                }
            });
            t.Start();

  finally不会因为调用堆栈中存在的异常而被终止,CLR会先执行catch块,然后再执行finally块

static void Main(string[] args)
        {
            Method3();
        }

        static void Method3()
        {
            ClassShouldDisposeBase c = null;
            try
            {
                c = new ClassShouldDisposeBase("Method3");
                Method4();
            }
            catch
            {
                Console.WriteLine("在Method3中捕获了异常。");
            }
            finally
            {
                c.Dispose();
            }

        }

        static void Method4()
        {
            ClassShouldDisposeBase c = null;
            try
            {
                c = new ClassShouldDisposeBase("Method4");
                throw new Exception();
            }
            catch
            {
                Console.WriteLine("在Method4中捕获了异常。");
                throw;
            }
            finally
            {
                c.Dispose();
            }
        }

  

猜你喜欢

转载自www.cnblogs.com/kafeibuhuizui/p/10614888.html