Özel Durumlar: try...with İfadesi

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

Syntax

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

Açıklamalar

ifadesi try...with F# içinde özel durumları işlemek için kullanılır. C# içinde try...catch deyimine benzer. Önceki söz dizimsinde, ifade1'de yer alan kod bir özel durum oluşturur. ifadesi try...with bir değer döndürür. Özel durum yoksa ifadenin tamamı1 ifadesinin değerini döndürür. Bir özel durum oluşturursa, her desen sırasıyla özel durumla karşılaştırıldı ve ilk eşleşen desen için, ilgili 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şleyicisinde 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ı yalıtır. Özel durum işleyicilerinde her ifadeden döndürülen değerlerin türleri, blokta ifadeden döndürülen türle try eşleşmesi gerekir.

Genellikle bir hatanın meydana geldiği, her bir özel durum işleyicisinde ifadelerden döndürülen geçerli bir değer olmadığını gösterir. Sık kullanılan bir desen, ifade türünün bir seçenek türü olmasıdır. Aşağıdaki kod örneği bu düzeni göstermektedir.

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ü kullanarak F# özel durumları exception tanımlayabilirsiniz.

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

Desen Description
:? özel durum türü Belirtilen .NET özel durum türüyle eşler.
:? tanımlayıcı olarak özel durum türü Belirtilen .NET özel durum türüyle eştir, ancak özel durumu adlandırılmış bir değer verir.
özel durum-adı(bağımsız değişkenler) F# özel durum türüyle eşler ve bağımsız değişkenleri bağlar.
Tanımlayıcı Herhangi bir özel durumla eşler ve adı özel durum nesnesine bağlar. :? ile eşdeğerdir. Tanımlayıcı olarak System.Exception
tanımlayıcı ne zaman koşulu Koşul true ise herhangi bir özel durumla eşler.

Örnekler

Aşağıdaki kod örnekleri, çeşitli özel durum işleyici 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

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

Not

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

Ayrıca bkz.