Tr

Try/Rescue में Elixir

1 अभ्यास

Try/Rescue के बारे में

try .. rescue का उपयोग ब्लॉक के अंदर उठने वाली एरर को पकड़ने और उनका मूल्यांकन करने के लिए किया जा सकता है।

उदाहरण के लिए:

try do
  raise RuntimeError, "error"
rescue
  e in RuntimeError -> :error
end
  • लाइन 1: ब्लॉक को try से घोषित किया जाता है।
  • लाइन 2: वह फंक्शन कॉल यहाँ रखा जाता है जिससे एरर हो सकती है; इस मामले में हम raise/1 को कॉल कर रहे हैं।
  • लाइन 4: rescue वाले हिस्से में हम उठाई गई एरर के मॉड्यूल नाम पर पैटर्न मैच करते हैं
    • -> के बाईं ओर:
      • e को एरर स्ट्रक्ट से मैच किया जाता है।
      • in एक कीवर्ड है।
      • RuntimeError वह मॉड्यूल है जिस पर मैच किया जाता है, लेकिन किसी भी एरर मॉड्यूल पर मैच किया जा सकता है, या _ पर, जो सभी एरर से मैच करता है।
    • दाईं ओर:
      • अगर एरर मैच हो जाए तो जो निर्देश चलाए जाते हैं।

एरर स्ट्रक्ट

इस तरह पकड़ी जाने वाली एरर (कभी-कभी इन्हें "एक्सेप्शन" भी कहा जाता है) स्ट्रक्ट होती हैं। अलग-अलग एरर स्ट्रक्ट में अलग-अलग की होती हैं। स्टैंडर्ड लाइब्रेरी के "एक्सेप्शन" वाले हिस्से में आपको सभी पहले से तय एरर की सूची मिलेगी।

# ArithmeticError caused by division by zero
%ArithmeticError{message: "bad argument in arithmetic expression"}

# Protocol.UndefinedError caused by passing `nil` to `Enum.count/1`
%Protocol.UndefinedError{description: "", protocol: Enumerable, value: nil}

Elixir में एरर पकड़ना बहुत कम होता है। आम तौर पर पकड़ी गई एरर को लॉग किया जाता है या किसी बाहरी मॉनिटरिंग सर्विस को भेजा जाता है, और फिर दोबारा उठाया जाता है। इसका मतलब है कि हमें आम तौर पर किसी खास एरर स्ट्रक्ट की अंदरूनी बनावट की परवाह नहीं करनी पड़ती।

एक्सेप्शन कॉन्सेप्ट में बताया गया है कि अपने खुद के एरर स्ट्रक्ट कैसे बनाएँ।

एंटी-पैटर्न से बचिए

  • ऐसे प्रोग्रामिंग पैटर्न से बचिए जो तार्किक प्रवाह को नियंत्रित करने के लिए एरर का इस्तेमाल करते हैं। Elixir में यह एक एंटी-पैटर्न है।

    # Avoid using errors for control-flow.
    try do
      {:ok, value} = MyModule.janky_function()
      "All good! #{value}."
    rescue
      e in RuntimeError ->
        reason = e.message
        "Uh oh! #{reason}."
    end
    
    # Rather, use control-flow structures for control-flow.
    case MyModule.janky_function() do
      {:ok, value} -> "All good! #{value}."
      {:error, reason} -> "Uh oh! #{reason}."
    end
    

एरर उठाना है या नहीं, यही सवाल है

जैसा कि Elixir की शुरुआती गाइड में लिखा है:

यह तय करना आपके एप्लिकेशन पर है कि [कोई काम करते समय] उठने वाली एरर असामान्य है या नहीं। इसीलिए Elixir [...] फंक्शनों पर एक्सेप्शन नहीं थोपता। इसके बजाय, Elixir यह डेवलपर पर छोड़ देता है कि वह आगे बढ़ने का सबसे अच्छा तरीका खुद चुने।

GitHub के ज़रिए संपादित करें यह लिंक नई विंडो या टैब में खुलता है।

Try/Rescue सीखिए