首先我们先讲一下try/catch/finally各自的职责和最佳用法
try块包含的代码组成了程序的的正常操作部分。
catch块包含的代码处理各种错误。
finally块包含的代码清理资源或执行要在try或catch块末尾执行的其它操作。无论是否产生异常都会执行finally块。
private bool test()
{
try
{
return true; //1
}
catch (Exception)
{
return false;//2
}
finally
{
//return true; //error
int i = 1;//3
}
return true;//4
}
在上面这段代码中,如果finally中出现了return则编译器会报错。我们再看一下它的执行顺序,如果程序没有异常的话,就先执行3然后执行1返回true;如果程序有异常的话,就先执行3再执行2返回 false。也就是说4永远不会被执行。
捕获异常时,catch块中应当尽量指定具体的异常筛选器,多个catch块应保证异常由特殊到一般的排列顺序:
private void main()
{
try
{
}
catch(IndexOutOfRangeException ex)
{
}
catch(Exception ex)
{
}
}
这个顺序很终于,如果以相反的顺序编写这两个块代码就不会编译,因为第二个块是不会执行的。
在此我们提出一个性能建议:要尽可能少的抛出异常,禁止将异常处理放在循环中,异常处理是非常耗时的,如果循环中有过多的异常处理很有可能导致服务器死机。
今日c#性能优化明星:异常处理放在循环外面
优化指数:95