Kivételek: A kísérlet... kifejezéssel
Ez a témakör az try...with
F#-ban a kivételkezeléshez használt kifejezést ismerteti.
Syntax
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
Megjegyzések
A try...with
kifejezés az F# kivételeinek kezelésére szolgál. Hasonló a C# utasításához try...catch
. Az előző szintaxisban a kifejezés1 kódja kivételt eredményezhet. A try...with
kifejezés egy értéket ad vissza. Ha nincs kivétel, a teljes kifejezés a kifejezés1 értékét adja vissza. Kivétel esetén a rendszer az egyes mintákat összehasonlítja a kivétellel, és az első egyező minta esetében a rendszer végrehajtja az adott ághoz tartozó, kivételkezelőnek nevezett megfelelő kifejezést, és a teljes kifejezés az adott kivételkezelőben lévő kifejezés értékét adja vissza. Ha nincs egyező minta, a kivétel addig propagálja a hívásvermet, amíg egyező kezelőt nem talál. A kivételkezelőkben lévő egyes kifejezésekből visszaadott értékek típusának meg kell egyeznie a blokk kifejezéséből try
visszaadott típussal.
A hiba előfordulása gyakran azt is jelenti, hogy az egyes kivételkezelők kifejezéseiből nem adható vissza érvényes érték. Gyakori minta, hogy a kifejezés típusa beállítástípus legyen. Az alábbi példakód ezt a mintát szemlélteti.
let divide1 x y =
try
Some (x / y)
with
| :? System.DivideByZeroException -> printfn "Division by zero!"; None
let result1 = divide1 100 0
A kivételek lehetnek .NET-kivételek, de lehetnek F# kivételek is. Az F#-kivételeket a exception
kulcsszó használatával határozhatja meg.
A kivételtípusra és egyéb feltételekre többféle mintával is szűrhet; a beállításokat az alábbi táblázatban foglalja össze.
Minta | Leírás |
---|---|
:? kivételtípus | Megfelel a megadott .NET-kivételtípusnak. |
:? kivételtípus azonosítóként | Megegyezik a megadott .NET-kivételtípussal, de névvel ellátott értéket ad a kivételnek. |
exception-name(argumentumok) | Megfelel egy F#-kivételtípusnak, és köti az argumentumokat. |
Azonosító | Megfelel a kivételnek, és a nevet a kivételobjektumhoz köti. Egyenértékű a következővel : System.Exception mintazonosító |
azonosító , ha a feltétel | Megfelel minden kivételnek, ha a feltétel igaz. |
Példák
Az alábbi kódminták a különböző kivételkezelő minták használatát szemléltetik.
// This example shows the use of the as keyword to assign a name to a
// .NET exception.
let divide2 x y =
try
Some( x / y )
with
| :? System.DivideByZeroException as ex -> printfn "Exception! %s " (ex.Message); None
// This version shows the use of a condition to branch to multiple paths
// with the same exception.
let divide3 x y flag =
try
x / y
with
| ex when flag -> printfn "TRUE: %s" (ex.ToString()); 0
| ex when not flag -> printfn "FALSE: %s" (ex.ToString()); 1
let result2 = divide3 100 0 true
// This version shows the use of F# exceptions.
exception Error1 of string
exception Error2 of string * int
let function1 x y =
try
if x = y then raise (Error1("x"))
else raise (Error2("x", 10))
with
| Error1(str) -> printfn "Error1 %s" str
| Error2(str, i) -> printfn "Error2 %s %d" str i
function1 10 10
function1 9 2
Feljegyzés
A try...with
szerkezet a kifejezéstől try...finally
eltérő kifejezés. Ezért ha a kódhoz blokkra és blokkra finally
is with
szükség van, akkor a két kifejezést be kell ágyaznia.
Feljegyzés
Aszinkron kifejezésekben, feladatkifejezésekben és más számítási kifejezésekben is használható try...with
, ebben az esetben a try...with
kifejezés testreszabott verzióját használja a rendszer. További információ: Async Expressions, Task Expressions, and Computation Expressions.