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(); } }
原文:https://www.cnblogs.com/kafeibuhuizui/p/10614888.html