當try語句執行完成後,finally塊中的語句必將被執行。不論是否會發生由以下原因導致的程序控制轉移:
●普通操作的結果;
●執行break,continue,goto,或return語句的結果;
●將異常傳播到語句之外的結果。
我們用一個例子來證明finally語句的運行。
程序清單8-10:
using System; class Test { public static void Main() { try { Console.WriteLine("try"); goto leave; } finally { Console.WriteLine("finally"); } leave: Console.WriteLine("leave"); } }
該程序的輸出結果為:
try
finally
leave
由此可見,finally子句總能被執行。因此我們可以利用try-finally來清除異常。
如果在執行finally塊時拋出了一個異常,這個異常將被傳播到下一輪try語句中去。如果在異常傳播過程中又發生了一個異常,那麼這個異常將被丟失。
最後,由於我們對待異常的態度往往是:捕捉、清除、繼續執行程序,因此我們需要在程序中使用try-catch(s)-finally結構。
下面的例子計算函數值
float x,y,z; try{ z=Math.Sqrt(x*x-y*y); } catch{ z=Math.Sqrt(y*y-x*x); } finally{ z=z+x; }
其中第一個try語句捕捉負數開根號的異常,並與第二個catch語句配合達到取絕對值的目的。