Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
- A
raisefüggvény azt jelzi, hogy hiba vagy kivételes állapot lépett fel. A hiba adatai egy kivételobjektumban lesznek rögzítve. - A
reraisefüggvény egy kezelt kivétel propagálására szolgál a hívásláncon.
Szemantika
raise (expression)
Megjegyzések
A raise függvény létrehoz egy kivételobjektumot, és elindítja a verem kikapcsolását. A verem visszatekerését a közös nyelvi futtatókörnyezet (CLR) felügyeli, így a folyamat viselkedése megegyezik bármely más .NET-nyelvével. A verem feloldási folyamata egy olyan kivételkezelő keresése, amely megfelel a létrehozott kivételnek. A keresés az aktuális try...with kifejezésben kezdődik, ha van ilyen. A blokk minden with mintájának ellenőrzése sorrendben történik. Ha egyező kivételkezelőt talál, a kivételt kezeltnek tekinti a rendszer; ellenkező esetben a verem feloldva van, és with a híváslánc blokkolása addig történik, amíg meg nem talál egyező kezelőt. A finally hívásláncban előforduló blokkokat a rendszer a verem visszatekerése közben is egymás után hajtja végre.
A raise függvény a C# vagy a C++ függvény megfelelője throw .
Az alábbi példakód bemutatja, hogy a raise függvény kivételt hoz létre.
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
A raise függvény a .NET-kivételek kiemelésére is használható, ahogy az alábbi példában is látható.
let divide x y =
if (y = 0) then raise (System.ArgumentException("Divisor cannot be zero!"))
else
x / y
Kivétel újbóli létrehozása
A reraise függvény blokkokban with használható egy kezelt kivétel propagálására a hívásláncon.
reraise kivétel operandusát nem veszi fel. Ez akkor hasznos, ha egy metódus átad egy argumentumot egy hívótól egy másik erőforrástár-metódusnak, és a kódtár-metódus kivételt hoz létre, amelyet át kell adni a hívónak.
A reraise függvény nem használható a with számított listákban, tömbökben, sorozatokban vagy számítási kifejezésekben lévő szerkezetek blokkjántrywith/, beleértve task { .. } vagy .async { .. }
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@()