共用方式為


例外狀況:嘗試...finally Expression

表達式 try...finally 可讓您執行清除程序代碼,即使程式碼區塊擲回例外狀況也一樣。

語法

try
    expression1
finally
    expression2

備註

try...finally不論 expression1 執行期間是否產生例外狀況,表達式都可以用來在上述語法的 expression2 中執行程式代碼。

expression2 的類型不會造成整個表達式的值;當例外狀況未發生時所傳回的類型是expression1中的最後一個值。 當發生例外狀況時,不會傳回任何值,且控制流程會傳輸到呼叫堆棧上下一個相符的例外狀況處理程式。 如果找不到例外狀況處理程式,程式就會終止。 在執行比對處理程式中的程式代碼或程序終止之前,會執行分支中的 finally 程序代碼。

下列程式代碼示範表達式的使用 try...finally 方式。

let divide x y =
   let stream : System.IO.FileStream = System.IO.File.Create("test.txt")
   let writer : System.IO.StreamWriter = new System.IO.StreamWriter(stream)
   try
      writer.WriteLine("test1")
      Some( x / y )
   finally
      writer.Flush()
      printfn "Closing stream"
      stream.Close()

let result =
  try
     divide 100 0
  with
     | :? System.DivideByZeroException -> printfn "Exception handled."; None

主控台的輸出如下所示。

Closing stream
Exception handled.

如您在輸出中看到,數據流在處理外部例外狀況之前已關閉,而且檔案 test.txt 包含文字 test1,這表示緩衝區已排清並寫入磁碟,即使例外狀況傳輸控件至外部例外狀況處理程式也一樣。

請注意,建 try...with 構是與 建構不同的建構 try...finally 。 因此,如果您的程式代碼需要 with 區塊和區塊,您必須巢狀兩個 finally 建構,如下列程式代碼範例所示。

exception InnerError of string
exception OuterError of string

let function1 x y =
   try
     try
        if x = y then raise (InnerError("inner"))
        else raise (OuterError("outer"))
     with
      | InnerError(str) -> printfn "Error1 %s" str
   finally
      printfn "Always print this."


let function2 x y =
  try
     function1 x y
  with
     | OuterError(str) -> printfn "Error2 %s" str

function2 100 100
function2 100 10

在計算運算式的內容中,包括時序表達式和異步表達式, 請嘗試...最後 ,表達式可以有自定義實作。 如需詳細資訊,請參閱 計算表達式

另請參閱