Share via


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.

Lásd még