catch 块必须按照最具体到最不具体排列。
finally块:只要控制离开try块,finally块就会执行,最适合用来执行资源清理。
规范:
要优先使用try/finally 而不是try catch块来实现资源清理代码。
要在抛出的一场中描述异常为什么发生,如有肯那个,还要说明如何防范。
避免捕捉无法获知其正确行动的异常,对这种异常不进行处理比处理的不正确要好。
有时catch块能够捕获到异常,但不能正确或者完整的处理它,在这个时候可以让这个catch块重新引发异常,方法是使用一个单独的throw语句,不在其后面指定任何异常。不指定exception变量所引用的异常,从而保持了异常中的“调用栈”信息,而throw exception将之前的信息替换成当前调用栈信息。而调试时一般需要知道原始调用栈。
规范:
要在捕捉并重新引发异常时使用空的throw语句,以便保持调用栈。
要通过引发异常而不是返回错误码来报告执行失败。
不要让公共成员将异常作为返回值或者Out参数。要通过异常来指明错误,不通过他们作为返回值来指明错误。
避免使用异常处理来处理意料之中的情况。异常是专门为了跟踪例外的,事先没有预料到的,而且可能造成严重后果的情况而设计的。
通常,开发者必须假定用户会采取非预期的行为,所以应当防卫性地编写代码,提前为所有能想到的“愚蠢的用户行为”拟定对策。
异常处理会带来毫秒级的性能损失。
使用TryParse()来执行数值转换。
if(int.TryParse(ageText,out age))
{
//TryParse方法返回bool值,所以要求使用out关键字在转换成功的情况下返回转换结果。
}
这样就避免了对于类型转换的异常处理。在CLI2.0版本中为所有数值类型都实现了这个方法