Lua Academy · पाठ

pcall से सुरक्षित कॉल

pcall का उपयोग करके त्रुटियों को सुरक्षित रूप से पकड़ें और वापसी मानों की व्याख्या करें।

पाठ 2, कुल 4 में से12 चरण

pcall से सुरक्षित कॉल, CoddyKit पर Lua Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Lua Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Lua Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

pcall की मूल बातें

pcall(f, ...) संरक्षित मोड में तर्क ... के साथ फ़ंक्शन f को कॉल करता है। यदि f सफल होता है, तो pcall पहले true और उसके बाद सभी लौटाए गए मान देता है। यदि f में त्रुटि आती है, तो pcall पहले false और उसके बाद त्रुटि संदेश देता है। दोनों ही स्थितियों में प्रोग्राम चलता रहता है।

local function risky(x)
  if x < 0 then error("negative input: " .. x) end
  return math.sqrt(x)
end

local ok, result = pcall(risky, 9)
print(ok, result)    -- true  3.0

ok, result = pcall(risky, -1)
print(ok, result)    -- false  ...: negative input: -1

विशिष्ट त्रुटियाँ पकड़ना

अलग-अलग प्रकार की त्रुटियों को अलग तरीके से संभालने के लिए pcall के बाद त्रुटि मान का प्रकार जाँचें। टेबल त्रुटियों में संरचित डेटा होता है; स्ट्रिंग त्रुटियों में संदेश होता है। दोनों स्थितियों को हमेशा संभालें।

local function op(errType)
  if errType == "table" then
    error({code=42, msg="structured error"})
  else
    error("plain string error")
  end
end

local ok, err = pcall(op, "table")
if not ok then
  if type(err) == "table" then
    print("Code:", err.code, "Msg:", err.msg)
  else
    print("String error:", err)
  end
end

सफलता पर अनेक लौटाए गए मान

सफलता पर pcall प्रारंभिक true के बाद संरक्षित फ़ंक्शन के सभी लौटाए गए मान देता है। इन्हें अनेक चरों में संग्रहित करें।

local function compute(a, b)
  return a + b, a * b, a - b
end

local ok, sum, product, diff = pcall(compute, 6, 4)
if ok then
  print("sum:", sum, "product:", product, "diff:", diff)
  -- sum: 10  product: 24  diff: 2
end

pcall को नेस्ट करना

pcall कॉल को नेस्ट किया जा सकता है। प्रत्येक pcall एक स्वतंत्र संरक्षित क्षेत्र बनाता है। आंतरिक pcall की त्रुटि आंतरिक pcall द्वारा पकड़ी जाती है, बाहरी द्वारा नहीं। इससे आप वैकल्पिक रणनीतियाँ लागू कर सकते हैं।

local function tryPrimary()
  error("primary failed")
end

local function tryFallback()
  return "fallback result"
end

local ok, result = pcall(tryPrimary)
if not ok then
  print("Primary failed:", result)
  ok, result = pcall(tryFallback)
end

if ok then print("Got:", result) end  -- fallback result

विधियों के साथ pcall

विधि (कोलन सिंटैक्स) को pcall के माध्यम से कॉल करने के लिए फ़ंक्शन और ऑब्जेक्ट को पहले तर्कों के रूप में दें। pcall(obj.method, obj, args...) का उपयोग करें या क्लोज़र में लपेटें।

local obj = {
  x = 10,
  compute = function(self, n)
    if n == 0 then error("zero divisor") end
    return self.x / n
  end
}

-- Pass method + self explicitly
local ok, v = pcall(obj.compute, obj, 2)
print(ok, v)   -- true  5.0

-- Or use a closure
ok, v = pcall(function() return obj:compute(0) end)
print(ok, v)   -- false  ...zero divisor

IO सुरक्षा के लिए pcall

अनपेक्षित OS त्रुटियों को पकड़ने के लिए IO कार्रवाइयों को pcall में लपेटें। एकसमान परिणाम/त्रुटि युग्म लौटाएँ, ताकि कॉल करने वाला विफलताओं को सहजता से संभाल सके।

local function safeRead(path)
  local ok, result = pcall(function()
    local f = assert(io.open(path, "r"))
    local content = f:read("a")
    f:close()
    return content
  end)
  if ok then return result
  else return nil, result
  end
end

local data, err = safeRead("config.txt")
if data then print("Read", #data, "bytes")
else print("Error:", err)
end

pcall के साथ पुनःप्रयास प्रतिरूप

अस्थिर कार्रवाई (नेटवर्क अनुरोध, फ़ाइल लेखन) को pcall से त्रुटियाँ पकड़ते हुए अधिकतम N बार दोहराएँ। वास्तविक कोड में पुनःप्रयासों के बीच कुछ समय रुकें (या कोरूटीन का उपयोग करें)।

local function retry(fn, maxAttempts)
  local attempts = 0
  while attempts < maxAttempts do
    attempts = attempts + 1
    local ok, result = pcall(fn)
    if ok then
      print("Succeeded on attempt", attempts)
      return result
    end
    print("Attempt", attempts, "failed:", result)
  end
  error("all " .. maxAttempts .. " attempts failed")
end

local n = 0
retry(function()
  n = n + 1
  if n < 3 then error("not ready") end
  return "done"
end, 5)

टेबल में pcall परिणाम संग्रहित करना

जब pcall का उपयोग लूप में किया जाए, तो बाद के विश्लेषण के लिए परिणामों को टेबल में रखें। यह उन बैच कार्रवाइयों में उपयोगी है जहाँ आप पहली विफलता पर रुकने के बजाय सभी मदों को संसाधित करके त्रुटियाँ एकत्र करना चाहते हैं।

local jobs = {10, -5, 25, 0, 16}
local results = {}

for _, n in ipairs(jobs) do
  local ok, v = pcall(function()
    if n < 0 then error("negative") end
    return math.sqrt(n)
  end)
  results[#results+1] = {input=n, ok=ok, value=v}
end

for _, r in ipairs(results) do
  if r.ok then
    print(r.input, "->", string.format("%.3f", r.value))
  else
    print(r.input, "-> ERROR:", r.value)
  end
end

pcall बनाम xpcall

pcall त्रुटि पकड़ता है, लेकिन आपको केवल त्रुटि मान देता है। xpcall आपको एक संदेश हैंडलर फ़ंक्शन देने देता है, जो कॉल-स्टैक के सुरक्षित रहते हुए चलता है और कॉल-स्टैक ट्रेस सक्षम करता है। जब आपको traceback चाहिए, तब xpcall चुनें।

-- pcall: simple, no traceback
local ok1, err1 = pcall(function()
  error("simple error")
end)
print(err1)   -- only the error message

-- xpcall: with traceback handler
local ok2, err2 = xpcall(
  function() error("traced error") end,
  function(e) return debug.traceback(e, 2) end
)
print(err2)   -- full stack trace

pcall लौटाने की परंपरा

एक सुसंगत API का आधार pcall को बनाएँ: सफलता पर हमेशा value, या विफलता पर nil, errorMessage लौटाएँ। अपने फ़ंक्शन इसी तरह व्यवस्थित करें, ताकि कॉल करने वाले को हमेशा पता हो कि क्या अपेक्षित है।

local function loadJSON(path)
  local ok, result = pcall(function()
    local f = assert(io.open(path, "r"))
    local text = f:read("a")
    f:close()
    -- Fake JSON parse for demo
    return {data = text, path = path}
  end)
  if ok then return result
  else return nil, result
  end
end

local data, err = loadJSON("data.json")
if data then print("Loaded:", data.path)
else print("Failed:", err)
end

त्वरित जाँच

संरक्षित फ़ंक्शन के सफल होने पर pcall क्या लौटाता है?

पुनरावलोकन: pcall

सारांश:

  • pcall(f, ...) → true, results... या false, err
  • सफलता या विफलता निर्धारित करने के लिए पहले लौटाए गए मान की जाँच करें
  • सफलता पर true के बाद अनेक लौटाए गए मान आते हैं
  • नेस्टेड pcall: प्रत्येक अपनी त्रुटियाँ स्वतंत्र रूप से पकड़ता है
  • पुनःप्रयास प्रतिरूप: अस्थिर कार्रवाइयों के लिए pcall वाला लूप
  • जब कॉल-स्टैक ट्रेस चाहिए, तब xpcall का उपयोग करें
शुरुआत निःशुल्क

एआई शिक्षक के साथ Lua सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
40
पाठ
159

अक्सर पूछे जाने वाले प्रश्न

क्या “pcall से सुरक्षित कॉल” पाठ निःशुल्क है?

हाँ — Lua Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “pcall से सुरक्षित कॉल” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Lua Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“pcall से सुरक्षित कॉल” में मैं क्या सीखूँगा?

pcall का उपयोग करके त्रुटियों को सुरक्षित रूप से पकड़ें और वापसी मानों की व्याख्या करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Lua Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Lua Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Lua Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“pcall से सुरक्षित कॉल” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Lua Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Lua Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. error() फ़ंक्शन
  2. pcall से सुरक्षित कॉल
  3. xpcall और संदेश हैंडलर
  4. संरचित त्रुटि ऑब्जेक्ट
← Lua Academy पर वापस जाएँ