Lua
गलती संभालना
खोज…
पीसीएल का उपयोग करना
pcall
"संरक्षित कॉल" के लिए खड़ा है। इसका उपयोग फ़ंक्शंस में एरर हैंडलिंग को जोड़ने के लिए किया जाता है। pcall
अन्य भाषाओं में try-catch
समान काम करता है। pcall
का लाभ यह है कि अगर pcall
साथ pcall
में गलतियाँ होती हैं तो स्क्रिप्ट का पूरा निष्पादन बाधित नहीं हो रहा है। यदि pcall
साथ एक फ़ंक्शन के अंदर कोई त्रुटि होती है, तो एक त्रुटि होती है और बाकी कोड निष्पादन जारी रखता है।
वाक्य - विन्यास:
pcall( f , arg1,···)
वापसी मान:
दो मान लौटाता है
- स्थिति (बूलियन)
- यदि फ़ंक्शन बिना किसी त्रुटि के निष्पादित किया गया था, तो सही है ।
- यदि फ़ंक्शन के अंदर कोई त्रुटि उत्पन्न हुई, तो गलत देता है।
- फ़ंक्शन या त्रुटि संदेश का रिटर्न मान यदि फ़ंक्शन ब्लॉक के अंदर कोई त्रुटि हुई।
पीसीएल का उपयोग विभिन्न मामलों के लिए किया जा सकता है, हालांकि एक सामान्य फ़ंक्शन से त्रुटियों को पकड़ना है जो आपके फ़ंक्शन को दिया गया है। उदाहरण के लिए, हम कहते हैं कि हमारे पास यह फ़ंक्शन है:
local function executeFunction(funcArg, times) then
for i = 1, times do
local ran, errorMsg = pcall( funcArg )
if not ran then
error("Function errored on run " .. tostring(i) .. "\n" .. errorMsg)
end
end
end
जब रन 3 पर दिए गए फ़ंक्शन की त्रुटियां हैं, तो त्रुटि संदेश उपयोगकर्ता को स्पष्ट करेगा कि यह आपके फ़ंक्शन से नहीं आ रहा है, लेकिन उस फ़ंक्शन से जो हमारे फ़ंक्शन को दिया गया था। इसके अलावा, इसे ध्यान में रखते हुए एक फैंसी बीएसओडी को उपयोगकर्ता को सूचित किया जा सकता है। हालाँकि, यह उस एप्लिकेशन पर निर्भर है जो एक एपीआई के रूप में इस फ़ंक्शन को लागू करता है, सबसे अधिक संभावना है कि ऐसा नहीं किया जाएगा।
उदाहरण ए - पीसीएल के बिना निष्पादन
function square(a)
return a * "a" --This will stop the execution of the code and throws an error, because of the attempt to perform arithmetic on a string value
end
square(10);
print ("Hello World") -- This is not being executed because the script was interrupted due to the error
उदाहरण बी - पीसीएल के साथ निष्पादन
function square(a)
return a * "a"
end
local status, retval = pcall(square,10);
print ("Status: ", status) -- will print "false" because an error was thrown.
print ("Return Value: ", retval) -- will print "input:2: attempt to perform arithmetic on a string value"
print ("Hello World") -- Prints "Hello World"
उदाहरण - निर्दोष संहिता का निष्पादन
function square(a)
return a * a
end
local status, retval = pcall(square,10);
print ("Status: ", status) -- will print "true" because no errors were thrown
print ("Return Value: ", retval) -- will print "100"
print ("Hello World") -- Prints "Hello World"
लुआ में त्रुटियों को संभालना
यह मानते हुए कि हमारे पास निम्नलिखित कार्य हैं:
function foo(tab)
return tab.a
end -- Script execution errors out w/ a stacktrace when tab is not a table
इसे थोड़ा सुधारते हैं
function foo(tab)
if type(tab) ~= "table" then
error("Argument 1 is not a table!", 2)
end
return tab.a
end -- This gives us more information, but script will still error out
यदि हम त्रुटि के मामले में भी किसी प्रोग्राम को क्रैश नहीं करना चाहते हैं, तो यह निम्न करने के लिए लुआ में मानक है:
function foo(tab)
if type(tab) ~= "table" then return nil, "Argument 1 is not a table!" end
return tab.a
end -- This never crashes the program, but simply returns nil and an error message
अब हमारे पास एक ऐसा कार्य है जो ऐसा व्यवहार करता है, हम इस तरह की चीजें कर सकते हैं:
if foo(20) then print(foo(20)) end -- prints nothing
result, error = foo(20)
if result then print(result) else log(error) end
और अगर हम चाहते हैं कि कार्यक्रम कुछ दुर्घटनाग्रस्त हो जाए, तो हम अभी भी ऐसा कर सकते हैं:
result, error = foo(20)
if not result then error(error) end
सौभाग्य से हमें हर बार वह सब लिखना नहीं पड़ता है; lua में एक फ़ंक्शन होता है जो ठीक यही करता है
result = assert(foo(20))