Özel Durumlar: try...with İfadesi

Bu konuda, F# dilinde özel durum işleme için kullanılan ifade olan ifade açıklanmaktadır try...with .

Sözdizimi

try
    expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...

Açıklamalar

İfade try...with , F# içindeki özel durumları işlemek için kullanılır. C# içindeki deyimine try...catch benzer. Yukarıdaki söz diziminde, ifade1 içindeki kod bir özel durum oluşturabilir. İfade try...with bir değer döndürür. Özel durum oluşturulursa, ifadenin tamamı ifade1 değerini döndürür. Bir özel durum oluşturulursa, her desen özel durumla sırayla karşılaştırılır ve ilk eşleşen desen için bu dal için özel durum işleyicisi olarak bilinen karşılık gelen ifade yürütülür ve genel ifade bu özel durum işleyicisindeki ifadenin değerini döndürür. Hiçbir desen eşleşmezse, özel durum eşleşen bir işleyici bulunana kadar çağrı yığınını yukarı yayılır. Özel durum işleyicilerindeki her ifadeden döndürülen değerlerin türleri, bloktaki try ifadeden döndürülen türle eşleşmelidir.

Genellikle, bir hatanın oluştuğu gerçeği, her özel durum işleyicisindeki ifadelerden döndürülebilecek geçerli bir değer olmadığı anlamına da gelir. Sık kullanılan bir desen, ifade türünün bir seçenek türü olmasıdır. Aşağıdaki kod örneğinde bu desen gösterilmektedir.

let divide1 x y =
   try
      Some (x / y)
   with
      | :? System.DivideByZeroException -> printfn "Division by zero!"; None

let result1 = divide1 100 0

Özel durumlar .NET özel durumları veya F# özel durumları olabilir. Anahtar sözcüğünü exception kullanarak F# özel durumları tanımlayabilirsiniz.

Özel durum türüne ve diğer koşullara göre filtrelemek için çeşitli desenler kullanabilirsiniz; seçenekler aşağıdaki tabloda özetlenmiştir.

Desen Açıklama
:? özel durum türü Belirtilen .NET özel durum türüyle eşleşir.
:? tanımlayıcı olarak özel durum türü Belirtilen .NET özel durum türüyle eşleşir, ancak özel duruma adlandırılmış bir değer verir.
özel durum-adı(bağımsız değişkenler) F# özel durum türüyle eşleşir ve bağımsız değişkenleri bağlar.
identifier Herhangi bir özel durumla eşleşir ve adı özel durum nesnesine bağlar. ile eşdeğer: Tanımlayıcı olarakSystem.Exception
koşul olduğunda tanımlayıcı Koşul true ise herhangi bir özel durumla eşleşir.

Örnekler

Aşağıdaki kod örnekleri, çeşitli özel durum işleyicisi desenlerinin kullanımını gösterir.

// 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

Not

try...with yapısı, ifadeden try...finally ayrı bir ifadedir. Bu nedenle, kodunuz hem blok with hem de blok finally gerektiriyorsa, iki ifadeyi iç içe yerleştirmeniz gerekir.

Not

Zaman uyumsuz ifadelerde, görev ifadelerinde ve diğer hesaplama ifadelerinde kullanabilirsiniz try...with ; bu durumda ifadenin try...with özelleştirilmiş bir sürümü kullanılır. Daha fazla bilgi için bkz . Zaman Uyumsuz İfadeler, Görev İfadeleri ve Hesaplama İfadeleri.

Ayrıca bkz.