Lua Academy · पाठ

xpcall और संदेश हैंडलर

विस्तृत त्रुटि ट्रेसबैक के लिए कस्टम हैंडलर के साथ xpcall का उपयोग करें।

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

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

xpcall सिंटैक्स

xpcall(f, handler, ...) संरक्षित मोड में तर्क ... के साथ f को कॉल करता है और त्रुटि होने पर handler(errorObject) को कॉल करता है। हैंडलर का लौटाया गया मान xpcall का दूसरा लौटाया गया मान बन जाता है। pcall के विपरीत, xpcall हैंडलर को कॉल-स्टैक के सुरक्षित रहते हुए चलाता है।

local function handler(err)
  return "HANDLED: " .. tostring(err)
end

local ok, msg = xpcall(
  function() error("something bad") end,
  handler
)

print(ok)   -- false
print(msg)  -- HANDLED: ...: something bad

हैंडलर के रूप में debug.traceback

सबसे सामान्य xpcall हैंडलर debug.traceback है। इसे सीधे हैंडलर के रूप में दें—यह त्रुटि को पूरे कॉल-स्टैक ट्रेस के साथ स्वरूपित करता है, जो उत्पादन त्रुटियों की डीबगिंग के लिए अत्यंत उपयोगी है।

local function level3() error("deep error") end
local function level2() level3() end
local function level1() level2() end

local ok, err = xpcall(level1, debug.traceback)

if not ok then
  -- err contains the full stack trace
  print(err)
end

संदर्भ वाला कस्टम हैंडलर

कस्टम हैंडलर संदर्भ जोड़ सकता है: समय-चिह्न जोड़ना, फ़ाइल में लॉग लिखना, निगरानी प्रणालियों को सूचित करना, और फिर स्वरूपित त्रुटि लौटाना। Lua अनुप्रयोगों में उत्पादन-स्तरीय त्रुटि प्रबंधन का यह मानक प्रतिरूप है।

local function errorHandler(err)
  local trace = debug.traceback(err, 2)
  local ts = os.date("%H:%M:%S")
  local report = string.format("[%s] ERROR\n%s", ts, trace)
  -- Could log to file here
  io.stderr:write(report .. "\n")
  return report
end

local ok, msg = xpcall(
  function()
    local t = nil
    return t.field   -- error!
  end,
  errorHandler
)
print("ok:", ok)

हैंडलर में त्रुटि नहीं आनी चाहिए

यदि संदेश हैंडलर में ही त्रुटि उठती है, तो Lua हैंडलर को दोबारा बुलाए बिना त्रुटि-सूचक लौटाता है। हैंडलर हमेशा अत्यंत विश्वसनीय लिखें—ऐसी IO न रखें जिसमें विफलता हो सकती है और nil पर अनुक्रमण न करें।

local function safeHandler(err)
  -- Keep handler simple and safe
  local ok, trace = pcall(debug.traceback, err, 2)
  if ok then return trace
  else return tostring(err) .. " (traceback failed)"
  end
end

local ok, msg = xpcall(
  function() error({complex="error table"}) end,
  safeHandler
)
print(ok, type(msg))

मुख्य लूप के लिए xpcall

लंबे समय तक चलने वाले प्रोग्रामों (सर्वर, गेम लूप) में मुख्य फ़ंक्शन को xpcall में लपेटें, ताकि बिना संभाली गई त्रुटियों को पकड़कर लॉग किया जा सके और प्रोग्राम बंद न हो। इसके बाद मुख्य लूप तय कर सकता है कि दोबारा शुरू करना है या बाहर निकलना है।

local function mainApp()
  -- simulate work
  for i = 1, 3 do
    print("Tick", i)
    if i == 2 then error("transient error") end
  end
end

local function handler(e)
  return debug.traceback("App error: "..tostring(e), 2)
end

local ok, err = xpcall(mainApp, handler)
if not ok then
  print("Application crashed:\n" .. err)
end

संरचित त्रुटि रिपोर्टिंग

विस्तृत और कार्रवाई योग्य त्रुटि रिपोर्ट बनाने के लिए xpcall को संरचित त्रुटि ऑब्जेक्ट और समृद्ध हैंडलर के साथ मिलाएँ, ताकि डीबगिंग या निगरानी डैशबोर्ड में उनका उपयोग किया जा सके।

local function handler(err)
  local info = {
    error   = tostring(err),
    time    = os.date("!%Y-%m-%dT%H:%M:%SZ"),
    trace   = debug.traceback(nil, 2),
  }
  return info
end

local ok, report = xpcall(
  function() error({code=500, msg="internal error"}) end,
  handler
)

if not ok then
  print("Time:", report.time)
  print("Error:", report.error)
  -- print("Trace:", report.trace)
end

कोरूटीन के लिए xpcall

कोरूटीन के भीतर pcall सामान्य रूप से काम करता है। कोरूटीन के अंदर की त्रुटियों से traceback पाने के लिए कोरूटीन के मुख्य भाग को xpcall में लपेटें। हैंडलर कोरूटीन के कॉल-स्टैक संदर्भ में चलता है।

local function co_body()
  error("error inside coroutine")
end

local co = coroutine.create(function()
  local ok, err = xpcall(co_body, debug.traceback)
  if not ok then
    print("Caught in coroutine:", err:match("([^\n]+)"))
  end
end)

coroutine.resume(co)

त्रुटि ऑब्जेक्ट को समृद्ध करना

हैंडलर सामान्य स्ट्रिंग त्रुटि को समृद्ध ऑब्जेक्ट में बदल सकता है या पहले से समृद्ध ऑब्जेक्ट में और जानकारी जोड़ सकता है। इससे निचले स्तर का कोड सरल त्रुटियाँ उठा सकता है, जबकि हैंडलर संदर्भ (अनुरोध ID, उपयोगकर्ता सत्र, परिवेश की जानकारी) जोड़ देता है।

local requestID = "req-123"

local function handler(err)
  if type(err) == "string" then
    return {message=err, requestID=requestID, level="error"}
  end
  err.requestID = requestID
  return err
end

local ok, result = xpcall(
  function() error("database timeout") end,
  handler
)

if not ok then
  print(result.message, result.requestID)
  -- database timeout  req-123
end

pcall और xpcall की तुलना

pcall का उपयोग तब करें जब: आपको केवल त्रुटि मान चाहिए, त्रुटि अपेक्षित है और उसी स्थान पर संभाली जाती है, या सरलता महत्वपूर्ण है। xpcall का उपयोग तब करें जब: आपको कॉल-स्टैक ट्रेस चाहिए, आप शीर्ष-स्तरीय सीमा पर हैं, या आप सभी त्रुटियों में संदर्भ जोड़ना चाहते हैं।

-- pcall: simple, no overhead
local ok, err = pcall(function()
  return 1/0   -- no error in Lua! returns inf
end)
print(ok, err)   -- true  inf

-- xpcall: adds traceback
local ok2, err2 = xpcall(
  function() error("real error") end,
  debug.traceback
)
print(ok2)       -- false
print(err2:sub(1,40))  -- first line of traceback

हैंडलर का लौटाया गया मान

हैंडलर जो भी लौटाता है, वही xpcall का दूसरा मान बन जाता है। यदि हैंडलर nil लौटाता है, तो xpcall का दूसरा लौटाया गया मान nil होता है। मूल त्रुटि ऑब्जेक्ट के साथ अतिरिक्त जानकारी लौटाने वाला हैंडलर सबसे लचीला तरीका है।

local function enrichedHandler(err)
  return {
    original = err,
    traceback = debug.traceback(nil, 2),
    timestamp = os.time(),
  }
end

local ok, report = xpcall(
  function() error("oops") end,
  enrichedHandler
)

if not ok then
  print(type(report))          -- table
  print(report.original)       -- ...: oops
  print(report.timestamp > 0)  -- true
end

त्वरित जाँच

pcall की तुलना में xpcall का मुख्य लाभ क्या है?

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

सारांश:

  • xpcall(f, handler, ...) — हैंडलर कॉल-स्टैक के सुरक्षित रहते हुए चलता है
  • पूरे traceback के लिए हैंडलर के रूप में debug.traceback का उपयोग करें
  • हैंडलर में त्रुटि नहीं आनी चाहिए—उसे सरल रखें
  • हैंडलर में संदर्भ जोड़कर त्रुटियों को समृद्ध करें
  • मुख्य लूप/सर्वर हैंडलर को xpcall में लपेटें
  • हैंडलर का लौटाया गया मान xpcall का दूसरा लौटाया गया मान बनता है
शुरुआत निःशुल्क

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

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

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

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

क्या “xpcall और संदेश हैंडलर” पाठ निःशुल्क है?

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

“xpcall और संदेश हैंडलर” में मैं क्या सीखूँगा?

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

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

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

“xpcall और संदेश हैंडलर” पाठ पूरा करने में कितना समय लगता है?

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

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

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

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

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