當一個異常拋出時,它會改變程序的執行流程。因此不能保證一個語句結束后,它后面的語句一定會執行,在 C# 中這個問題可以用 finally 解決。
為了確保一個語句總是能執行(不管是否拋出異常),需要將該語句放到一個 finally 塊中,finally 要么緊接在 try 塊之后,要么緊接在 try 塊之后的最后一個 catch 處理程序之后。
只要程序進入與一個 finally 塊關聯的 try 塊,則 finally 塊始終都會運行 -- 即使發生了一個異常。
代碼如下所示:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CheckedAndUnchecked { class Program { static void Main(string[] args) { { try { int a; string b; Console.WriteLine("請輸入一個整數"); b = Console.ReadLine(); a = int.Parse(b); } catch (Exception ex) { Console.WriteLine(ex); } finally { Console.WriteLine("finally塊內總是能運行到"); // 總是能執行到這里 } } } } }
因為 try 會捕捉異常,在此處輸入 1.0,格式不正確,則 runtime 會捕捉到異常,但 finally 塊內的代碼卻始終會執行。
執行后結果如下:
如果一個異常被拋出,且在本地捕捉到,則首先運行異常處理程序,然后運行 finally 塊;
如果異常未能在本地捕捉到,則首先運行 finally 塊,再去上一級搜索一個匹配的異常處理程序並運行。