2011-07-07 12 views
12

Ben bir özel durum yakalamak için çalıştı ama derleyici uyarı verir: Her zaman bir soruF # uyarısı olmadan herhangi bir özel durum (System.Exception) nasıl yakalanır?

let testFail() = 
    try 
     printfn "Ready for failing..." 
     failwith "Fails" 
    with 
    | :? System.ArgumentException ->() 
    | :? System.Exception ->() 

yapacak Bu tip testi veya mahzun: how ı uyarmadan bunu yapmak için?

gibi C# (başka türlü hiçbir uyarı bulunmalıdır, bunu yapmanın bir yolu olmalı inanmak)

try 
{ 
    Console.WriteLine("Ready for failing..."); 
    throw new Exception("Fails"); 
} 
catch (Exception) 
{ 
} 
+1

C# örneğiniz ReSharper veya FxCop kullanan herkes için bir uyarı verir. [Neden?] (Http://blogs.msdn.com/b/codeanalysis/archive/2006/06/14/631923.aspx) –

+1

@Joel Mueller, makaleniz için teşekkürler. Genel istisnayı da yakalamaktan hoşlanmıyorum, ancak bazen beklenmedik istisna kullanıcıları şaşırtabilir. – LLS

cevap

26

C#:

void testFail() 
{ 
    try 
    { 
     Console.WriteLine("Ready for failing..."); 
     throw new Exception("Fails"); 
    } 
    catch (ArgumentException) 
    { 
    } 
    catch 
    { 
    } 
} 

F # eşdeğeri:

let testFail() = 
    try 
     printfn "Ready for failing..." 
     failwith "Fails" 
    with 
    | :? System.ArgumentException ->() 
    | _ ->() 

C#:

void testFail() 
{ 
    try 
    { 
     Console.WriteLine("Ready for failing..."); 
     throw new Exception("Fails"); 
    } 
    catch (ArgumentException ex) 
    { 
    } 
    catch (Exception ex) 
    { 
    } 
} 

F # eşdeğeri:

let testFail() = 
    try 
     printfn "Ready for failing..." 
     failwith "Fails" 
    with 
    | :? System.ArgumentException as ex ->() 
    | ex ->() 

C#:

void testFail() 
{ 
    try 
    { 
     Console.WriteLine("Ready for failing..."); 
     throw new Exception("Fails"); 
    } 
    catch 
    { 
    } 
} 

F # eşdeğeri:

let testFail() = 
    try 
     printfn "Ready for failing..." 
     failwith "Fails" 
    with 
    | _ ->() 

Joel'in belirttiği gibi, C# 'da catch (Exception)'u kullanmak istemezsiniz, aynı nedenle F # içinde | :? System.Exception -> kullanmazsınız.

+0

Teşekkür ederim. Bu çok detaylı. Joel'in yorumunu okuduktan sonra, genel istisnayı yakalamaktan kaçınmaya çalışacağım. Ama sanırım bazen zarafetle başarısız olmanız gerekebilir ... (En azından kullanıcı dostu bir şekilde hata mesajları ver) – LLS

+1

@LLS: Bu 'İstisna'nın' tabanını yakalamak değil, mutlaka bir problem. İstisna) {} 've' catch {} 'özdeş semantiklere sahiptir, bu yüzden eski gereksizdir ve bir uyarı üretir. Eğer istisna nesnesi _name_, yakala (exception ex) {} ', uyarı yok. – ildjarn

3
try 
    .. code .. 
with 
    | _ as e -> 
+0

Joker maçı nasıl oynayabileceğini bilmiyordum. Bu gerçekten kullanışlı (ve sadece özel durumlar için değil) – piers7

+0

'_' gerçekten gereksiz ve aslında bu kod' _' değişkeninin '| _ e -> (...) ' , ' | e -> (..) ' Bir desen eşleşmesi deyiminde koruma cümlesi olmayan tüm varlıklar bir yakalamadır, '_' değişkeni basitçe değere önem vermediğinizi belirtir. '_' türünün Aliasing'i ilk etapta' _''ı zayıflatır. – Vidar

İlgili konular