2011-07-07 12 views
12

मैं एक अपवाद को पकड़ने की कोशिश की लेकिन संकलक चेतावनी देता है: इस प्रकार का परीक्षण या खिन्न हमेशा का आयोजन करेगाएफ # में चेतावनी के बिना किसी अपवाद (सिस्टम.एक्सप्शन) को कैसे पकड़ें?

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

सवाल यह है: मैं कैसे बिना किसी चेतावनी के यह करने के लिए? (मेरा मानना ​​है कि यह करने के लिए एक तरह से होना चाहिए, अन्यथा कोई चेतावनी होना चाहिए)

की तरह सी #

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

आपका सी # उदाहरण ReSharper या FxCop का उपयोग करने वाले किसी के लिए चेतावनी का कारण बनता है। [क्यों?] (Http://blogs.msdn.com/b/codeanalysis/archive/2006/06/14/631923.aspx) –

+1

@ जोएल म्यूएलर, आपके लेख के लिए धन्यवाद। मैं सामान्य अपवाद को पकड़ना पसंद नहीं करता हूं, लेकिन कभी-कभी अप्रत्याशित अपवाद उपयोगकर्ताओं को भ्रमित कर सकता है। – LLS

उत्तर

26

सी #:

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

एफ # बराबर:

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

सी #:

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

एफ # बराबर:

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

सी #:

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

एफ # बराबर:

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

जैसा कि जोएल ने नोट किया था, आप उसी कारण से catch (Exception) सी # में उपयोग नहीं करना चाहेंगे क्योंकि आप F # में | :? System.Exception -> का उपयोग नहीं करते हैं।

+0

धन्यवाद। यह बहुत विस्तृत है। जोएल की टिप्पणी पढ़ने के बाद, मैं सामान्य अपवाद को पकड़ने से बचने की कोशिश करूंगा। लेकिन मुझे लगता है कि कभी-कभी अनुग्रह में विफल होने के लिए आवश्यक हो सकता है ... (कम से कम उपयोगकर्ता के अनुकूल तरीके से त्रुटि संदेश दें) – LLS

+1

@LLS: यह नहीं है कि आधार 'अपवाद' प्रकार को पकड़ना आवश्यक रूप से एक समस्या है, यह है कि 'पकड़ो (अपवाद) {} 'और' पकड़ {} 'समान अर्थशास्त्र है, इसलिए पूर्व अनावश्यक है और चेतावनी उत्पन्न करता है। यदि आप अपवाद ऑब्जेक्ट _name_ करते हैं, तो 'पकड़ें (अपवाद पूर्व) {} ', कोई चेतावनी नहीं है। – ildjarn

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

मुझे नहीं पता था कि आप वाइल्डकार्ड मैच को उपनाम कर सकते हैं। यह वास्तव में आसान है (और केवल अपवाद हैंडलिंग के लिए नहीं) – piers7

+0

'_' वास्तव में अनावश्यक है, और वास्तव में यह कोड' _' चर 'के उद्देश्य को कम करता है। _ के रूप में ई -> (...) ' ' से कुछ भी अलग नहीं है। ई -> (..) ' पैटर्न पैटर्न मिलान में गार्ड क्लॉज के बिना कोई भी var एक कैच है, परिवर्तनीय '_' नामकरण बस यह बताता है कि आपको मूल्य की परवाह नहीं है। '_' प्रकार की एलियंसिंग पहले स्थान पर '_' को कमजोर करती है। – Vidar

संबंधित मुद्दे