2017-03-21 12 views

उत्तर

20

जैसा कि आपने देखा होगा, जंग में अपवाद नहीं हैं। इसमें घबराहट है, लेकिन उनकी कार्यक्षमता सीमित है (वे संरचित जानकारी नहीं ले सकते हैं) और त्रुटि-हैंडलिंग के लिए उनका उपयोग निराश है (वे अप्राप्य त्रुटियों के लिए हैं)।

जंग में, त्रुटि प्रबंधन Result का उपयोग करता है। एक विशिष्ट उदाहरण होगा:

fn halves_if_even(i: i32) -> Result<i32, Error> { 
    if i % 2 == 0 { Ok(i/2) } else { Err(/* something */) } 
} 

fn do_the_thing(i: i32) -> Result<i32, Error> { 
    let i = match halves_if_even(i) { 
     Ok(i) => i, 
     e => return e, 
    }; 

    // use `i` 
} 

यह बहुत अच्छा है क्योंकि:

  • जब कोड लिखने अगर आप गलती से त्रुटि से निपटने के लिए नहीं भूल सकता,
  • जब कोड को पढ़ने के आप तुरंत देख सकते हैं कि यहां त्रुटि के लिए एक संभावित संभावना है।

यह आदर्श से कम है, हालांकि, यह बहुत verbose है। यह जहां प्रश्न चिह्न ऑपरेटर ? में आता है

ऊपर के रूप में लिखा जा सकता है:।

fn do_the_thing(i: i32) -> Result<i32, Error> { 
    let i = halves_if_even(i)?; 

    // use `i` 
} 

जो बहुत अधिक संक्षिप्त है।

क्या ? ऊपर match कथन के बराबर है। संक्षेप में: यह Result को अनपैक करता है यदि ठीक है और देता है तो त्रुटि नहीं होती है।

यह थोड़ा जादू है, लेकिन त्रुटि प्रबंधन को बॉयलरप्लेट को काटने के लिए कुछ जादू की आवश्यकता होती है, और अपवादों के विपरीत यह तुरंत दिखाई देता है कि कौन से फ़ंक्शन कॉल ? से सजाए गए हैं।

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