pcall से सुरक्षित कॉल
pcall का उपयोग करके त्रुटियों को सुरक्षित रूप से पकड़ें और वापसी मानों की व्याख्या करें।
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
endpcall को नेस्ट करना
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 divisorIO सुरक्षा के लिए 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)
endpcall के साथ पुनःप्रयास प्रतिरूप
अस्थिर कार्रवाई (नेटवर्क अनुरोध, फ़ाइल लेखन) को 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
endpcall बनाम 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 tracepcall लौटाने की परंपरा
एक सुसंगत 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 पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- error() फ़ंक्शन
- pcall से सुरक्षित कॉल
- xpcall और संदेश हैंडलर
- संरचित त्रुटि ऑब्जेक्ट