异常: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@()