异常:raise 和 reraise 函数

  • raise 函数用于指示发生了错误或异常情况。 在异常对象中捕获有关错误的信息。
  • reraise 函数用于将已处理的异常沿调用链向上传播。

语法

raise (expression)

备注

raise 函数生成异常对象并启动堆栈展开过程。 堆栈展开过程由公共语言运行时 (CLR) 管理,因此该过程的行为与在任何其他 .NET 语言中的行为相同。 堆栈展开过程是搜索与生成的异常匹配的异常处理程序。 搜索从当前的 try...with 表达式(如果有)开始。 按顺序检查 with 块中的每个模式。 当找到匹配的异常处理程序时,该异常将被视为已处理;否则,将展开堆栈,并检查调用链上的 with 块,直到找到匹配的处理程序。 在堆栈展开时,调用链中遇到的任何 finally 块也会按顺序执行。

raise 函数相当于 C# 或 C++ 中的 throw

以下代码示例说明了如何使用 raise 函数生成异常。

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

raise 函数还可用于引发 .NET 异常,如以下示例所示。

let divide x y =
  if (y = 0) then raise (System.ArgumentException("Divisor cannot be zero!"))
  else
     x / y

重新引发异常

reraise 函数可在 with 块中使用,以将已处理的异常向上传播到调用链。 reraise 不采用异常操作数。 当方法将参数从调用方传递给其他库方法时,这是最有用的,库方法引发的异常必须传递给调用方。

reraise 函数不能用于计算列表、数组、序列或计算表达式(包括 task { .. }async { .. })中的 try/with 构造的 with 块。

open System

let getFirstCharacter(value: string) =
    try
        value[0]
    with :? IndexOutOfRangeException as e ->
        reraise()

let s = getFirstCharacter("")
Console.WriteLine($"The first character is {s}")

// The example displays the following output:
//   System.IndexOutOfRangeException: Index was outside the bounds of the array.
//      at System.String.get_Chars(Int32 index)
//      at getFirstCharacter(String value)
//      at <StartupCode>.main@()

另请参阅