try catch
clr自上而下搜索匹配的catch块,一个try块对应多个catch块,越具体的catch应该在上面,接着是她们的基类型,最后是exception类,未指定也是exception类型。如果上下顺序反了,那么具体的catch块会执行不到,编译器会报错。
try catch 以后,如果只是处理了捕获的异常(例如记日志),没有抛出异常(throw),后续代码会继续执行
throw是抛出一个异常,中断执行后续代码,如果一个方法可能会有异常,但你不想处理这个异常,就是用throw,谁调用了这个方法谁就要处理这个异常,或者继续抛出。
throw和throw ex
1 throw ex 抛出与catch捕捉到的相同的异常对象,导致clr重置该异常的起点。认为你catch到的异常已经被处理了,只不过处理过程中又抛出新的异常,从而找不到真正的错误源 try{ }catch (Exception ex){ throw ex; }
2 throw 重新抛出异常对象,clr不会重置起点(推荐使用这个)try{} catch{ throw;}
3 或者对异常就行重新包装,保留原始异常点信息,然后抛出
finally:
无论代码有没有抛出异常,finally块始终会执行。应该先用finally块清理那些已经成功的操作,还可以用finally显示释放对象避免资源泄露。
使用了 lock,using,foreach的语句,c#编译器会自动加上try finally块,并在finally中自动释放资源
可以在一个线程中补获异常,在另外一个线程中重新抛出异常;
clr在调用栈中向上查找与抛出的异常对象类型匹配的catch块,没有任何catch块匹配抛出的异常类型,就会发生一个未处理的异常