Lua Academy · पाठ

error() फ़ंक्शन

error() से त्रुटियाँ उत्पन्न करें और त्रुटि-स्तरों तथा संदेशों को समझें।

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

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

त्रुटियाँ उठाना

error(message, level) Lua की त्रुटि उठाता है। निष्पादन रुक जाता है और त्रुटि कॉल स्टैक में ऊपर तब तक फैलती है, जब तक उसे pcall या xpcall पकड़ न ले, या वह प्रोग्राम को समाप्त न कर दे। संदेश कोई भी मान हो सकता है—स्ट्रिंग, टेबल या संख्या।

local function divide(a, b)
  if b == 0 then
    error("division by zero")
  end
  return a / b
end

print(divide(10, 2))    -- 5.0
-- divide(10, 0)        -- ERROR: division by zero

त्रुटि स्तर

error() का दूसरा आर्ग्युमेंट यह नियंत्रित करता है कि त्रुटि कहाँ रिपोर्ट की जाए। स्तर 1 (डिफ़ॉल्ट) स्वयं error() कॉल को दर्शाता है। स्तर 2 कॉल करने वाले को दर्शाता है। स्तर 0 में स्थान संबंधी कोई जानकारी नहीं जोड़ी जाती। लाइब्रेरी फ़ंक्शन में उपयोगकर्ता के कोड को जिम्मेदार ठहराने के लिए स्तर 2 का उपयोग करें।

local function assertPositive(n, name)
  if n <= 0 then
    error((name or "value") .. " must be positive, got " .. n, 2)
    -- level 2: blame the caller, not this function
  end
  return n
end

local function compute(x)
  assertPositive(x, "x")   -- error points here if x <= 0
  return math.sqrt(x)
end

compute(-5)  -- error: "x must be positive, got -5" at compute() call

टेबल ऑब्जेक्ट के साथ त्रुटि

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

local function openDB(host, port)
  if port < 1 or port > 65535 then
    error({code="INVALID_PORT", port=port,
           msg="port out of range: " .. port})
  end
  -- ... connect
  return {host=host, port=port}
end

local ok, err = pcall(openDB, "localhost", -1)
if not ok and type(err) == "table" then
  print("Code:", err.code)    -- INVALID_PORT
  print("Port:", err.port)    -- -1
  print("Msg:", err.msg)
end

शॉर्टकट के रूप में assert()

assert(v, msg), if not v then error(msg, 2) end; return v, ... के समतुल्य है। पूर्वशर्त जाँचने के लिए यह प्रचलित तरीका है। यदि v सत्य-सदृश है, तो assert अपने सभी आर्ग्युमेंट लौटाता है (चेनिंग के लिए उपयोगी)।

local function sqrt(n)
  assert(type(n) == "number", "expected number, got " .. type(n))
  assert(n >= 0, "sqrt of negative: " .. n)
  return math.sqrt(n)
end

print(sqrt(16))    -- 4.0
print(sqrt(2))     -- 1.4142...
-- sqrt("hi")      -- ERROR: expected number, got string

error() बनाम return nil,err

विफलता का संकेत देने की दो परंपराएँ हैं: error() (अपवाद-शैली) या return nil, msg (फ़ंक्शनल शैली)। वास्तव में अनपेक्षित स्थितियों (प्रोग्रामिंग बग, अनुबंध उल्लंघन) के लिए error() का उपयोग करें। अपेक्षित विफलताओं (फ़ाइल न मिलना, नेटवर्क टाइमआउट) के लिए nil, msg का उपयोग करें।

-- Exception style (programming error)
local function mustExist(t, key)
  local v = t[key]
  if v == nil then error("required key missing: " .. key, 2) end
  return v
end

-- Functional style (expected failure)
local function findUser(id)
  -- ... database query
  return nil, "user not found"  -- expected: user may not exist
end

मेटामेथड में त्रुटि

मेटामेथड के भीतर त्रुटियाँ उठाई जा सकती हैं। यदि कोई मेटामेथड त्रुटि देता है, तो यह उस ऑपरेशन को शुरू करने वाले कोड तक फैलती है (जैसे अंकगणितीय एक्सप्रेशन)। मेटामेथड में अमान्य इनपुट से हमेशा सुरक्षा करें।

local SafeDiv = {}
SafeDiv.__index = SafeDiv

SafeDiv.__div = function(a, b)
  if b.value == 0 then
    error("SafeDiv: division by zero", 2)
  end
  return SafeDiv.new(a.value / b.value)
end

function SafeDiv.new(v)
  return setmetatable({value=v}, SafeDiv)
end

local a = SafeDiv.new(10)
local b = SafeDiv.new(0)
local ok, err = pcall(function() return a / b end)
print(ok, err)

कस्टम त्रुटि प्रकार

टाइपयुक्त त्रुटि ऑब्जेक्ट बनाने के लिए एक सहायक बनाएँ। एक प्रकार टैग शामिल करें, ताकि कॉल करने वाला अलग-अलग प्रकार की त्रुटियों में अंतर कर सके और प्रत्येक को उचित रूप से संभाल सके।

local function newError(kind, msg, extra)
  return setmetatable(
    {kind=kind, message=msg, extra=extra},
    {__tostring = function(e)
      return "[" .. e.kind .. "] " .. e.message
    end}
  )
end

local E = {
  notFound = function(name) return newError("NOT_FOUND","not found: "..name) end,
  badInput = function(msg)  return newError("BAD_INPUT", msg) end,
}

local ok, err = pcall(error, E.notFound("config.json"))
if not ok then print(err.kind, err.message) end

त्रुटि प्रसार

जब कोई फ़ंक्शन ऐसी दूसरी फ़ंक्शन को कॉल करता है जिसमें त्रुटि आती है, तो त्रुटि स्वतः कॉल-स्टैक में ऊपर की ओर फैलती है। आपको उसे दोबारा उठाने की आवश्यकता नहीं है—बस उसे पकड़ें नहीं। त्रुटियों को केवल उसी स्तर पर पकड़ें जहाँ आप उन्हें सार्थक रूप से संभाल या रिपोर्ट कर सकते हों।

local function step3() error("step3 failed") end
local function step2() step3() end
local function step1() step2() end

local ok, err = pcall(step1)
if not ok then
  -- err includes the source location
  print("Caught at top level:", err)
end
-- Error: input:1: step3 failed

debug.traceback के साथ कॉल-स्टैक ट्रेस

एक सामान्य error() केवल एक पंक्ति का संदर्भ देता है। पूरे कॉल-स्टैक ट्रेस के लिए debug.traceback(msg) को त्रुटि मान के रूप में उपयोग करें। यह सामान्यतः xpcall हैंडलर में किया जाता है।

local function buggy()
  local t = nil
  return t.field   -- nil indexing: error
end

local ok, err = xpcall(buggy, function(e)
  return debug.traceback(e, 2)  -- full stack trace
end)

if not ok then
  print(err)  -- full traceback
end

त्रुटियाँ दोबारा उठाना

कभी-कभी आप संदर्भ जोड़ने के लिए त्रुटि पकड़ते हैं और फिर उसे दोबारा उठाते हैं। स्ट्रिंग त्रुटि दोबारा उठाते समय error(err, 0) (स्तर 0) का उपयोग करें, ताकि पहले से स्वरूपित संदेश में स्थान का एक और उपसर्ग न जुड़ जाए।

local function loadAndParse(path)
  local ok, err = pcall(function()
    local f = io.open(path, "r")
    if not f then error("cannot open: " .. path) end
    local content = f:read("a")
    f:close()
    return content
  end)
  if not ok then
    error("loadAndParse failed: " .. err, 0)  -- re-raise with context
  end
end

local ok2, msg = pcall(loadAndParse, "missing.txt")
print(ok2, msg)

त्वरित जाँच

error("msg", 2) में स्तर 2 का क्या अर्थ है?

पुनरावलोकन: error()

सारांश:

  • error(msg, level) — त्रुटि उठाता है; स्तर 2 के लिए कॉल करने वाला उत्तरदायी माना जाता है
  • टाइप और संदर्भ वाली संरचित त्रुटियों के लिए टेबल का उपयोग करें
  • assert(v, msg) — पूर्वशर्त जाँचने का प्रचलित तरीका
  • बग के लिए error() का उपयोग करें; अपेक्षित विफलताओं के लिए nil+err लौटाएँ
  • संदेश का प्रारूप बनाए रखने के लिए error(err, 0) से दोबारा उठाएँ
शुरुआत निःशुल्क

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

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

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

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

क्या “error() फ़ंक्शन” पाठ निःशुल्क है?

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

“error() फ़ंक्शन” में मैं क्या सीखूँगा?

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

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

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

“error() फ़ंक्शन” पाठ पूरा करने में कितना समय लगता है?

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

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

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

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

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