Ö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.